1. 圖的定義編程
(1)定義:圖是由頂點集合(Vertex)及頂點間的關係集合(Edge)組成的一種數據結構。Graph = (V, E); 其中:數據結構
V={x|x∈某個數據對象}是頂點的有窮非空集合spa
E={(x,y)}x, y∈V}是頂點之間關係(邊)的有窮集合code
(2)比較線性表、樹和圖的不一樣對象
|
數據元素blog 的名稱ci |
數據對象rem (數據元素的集合)get |
數據元素table 之間的關係 |
線性表 |
元素 |
無元素爲空表 |
線性關係 |
樹 |
結點 |
無結點的爲空樹 |
層次關係 |
圖 |
頂點(Vertex) |
頂點集有窮非空 |
邊(邊集可爲空) |
2. 相關概念
(1)無向邊和無向圖
①無向邊:若頂點x和y之間的邊沒有方向,稱邊(x,y)爲無向邊(注意,用圓括號表示)。可見,(x,y)和(y,x)的意義相同,表示x和y之間有鏈接,x和y互爲鄰接點(adjacent)。
②無向圖:任意兩個頂點之間的邊均爲無向邊的圖,稱爲無向圖(Undirected Graph)。如圖G1={V,{E}},其中頂點集V={A,B,C,D},邊集E={(A,B),(B,C),(C,D),(D,A),(A,C)}
(2)有向邊和有向圖
①有向邊:若頂點x和y之間的邊有方向,稱邊<x,y>稱爲有向邊或弧(Arc)(注意:用尖括號表示)。可見,<x,y>和<y,x>意義不一樣,表示x鏈接到y。x爲弧尾(Tail),y爲弧頭(Head)
②有向圖:任意兩個頂點之間的邊均爲有向邊的圖,稱爲有向圖(Directed Graph)。對於有向圖G={V,{E}},其中頂點集V={A,B,C,D} ,邊集E={<A,D>,<B,A>,<B,C>,<C,A>}
(3)頂點的度
①入度(InDegree):以v爲頭的邊的數目,記爲ID(v)。入度是針對有向圖的,如圖G2圖中A的入度爲2。
②出度(OutDegree):以v爲尾的邊的數目,記爲OD(v)。出度也是針對有向圖的,如圖G2中A的出度爲1。
③頂點的度:頂點v的度是和v相關聯的邊的數目,記爲TD(v)。適用於無向圖和有向圖,對於有向圖而言TD(v)=ID(v)+OD(v)。
④頂點和邊的關係
頂點度數 |
TD(v) = ID(v) + OD(v) |
頂點度數=入度+出度 |
邊數 |
E=[TD(v1)+TD(v2)+…+TD(vn)]/2 |
邊數=總度數/2 |
E=ID(v1)+ID(v2)+…+ID(vn) |
邊數=總入度 |
|
E=OD(v1)+OD(v2)+…+OD(vn) |
邊數=總出度 |
(4)權(weight):與圖的邊相關的數字,能夠表示頂點間的距離或耗費。
3. 圖的操做
(1)常見的操做:①獲取/設置頂點的值;②獲取鄰接頂點;③獲取/設置邊的值。④刪除邊;⑤獲取頂點數/邊數;⑥獲取頂點的度數;⑦判斷是否爲無向圖,等等。
【編程實驗】圖的抽象類建立
#ifndef _GRAPH_H_ #define _GRAPH_H_ #include "Object.h" #include "SharedPointer.h" #include "Array.h" namespace DTLib { //V爲頂點類型,E爲邊類型 template<typename V, typename E> class Graph : public Object { public: virtual V getVertex(int i) = 0; virtual bool getVertex(int i, V& value) = 0; virtual bool setVertex(int i, const V& value) = 0; //獲取頂點i的鄰接頂點 virtual SharedPointer<Array<int> > getAdjacent(int i) = 0; //參數i爲起點、j爲終點、value爲邊(權值) virtual E getEdge(int i, int j) = 0; virtual bool getEdge(int i, int j, E& value) = 0; virtual bool setEdge(int i, int j, const E& value) = 0; virtual bool removeEdge(int i, int j) = 0; //判斷是否可看作無向圖 bool asUndirected() { bool ret =true; for(int i=0; i<vCount() && ret; i++){ for(int j=0; j<vCount() && ret; j++){ //判斷i和j互爲鄰接頂點且<i,j>和<j,i>邊的權值相等 if(isAdjacent(i, j)){ ret = ret && isAdjacent(j, i) && (getEdge(i, j) == getEdge(j, i)); } } } return ret; } //判斷圖中頂點i到頂點j是否鄰接 virtual bool isAdjacent(int i, int j) = 0; virtual int vCount() = 0; //獲取頂點的數量 virtual int eCount() = 0; //獲取邊的數量 virtual int OD(int i) = 0; //獲取頂點i的出度 virtual int ID(int i) = 0; //獲取頂點i的入度 virtual int TD(int i) //獲取頂點i的度 { return ID(i) + OD(i); } }; } #endif // _GRAPH_H_
4. 小結
(1)圖是頂點與邊的集合,是一種非線性的數據結構
(2)圖中頂點能夠與多個其它頂點產生鄰接關係
(3)邊的權值,用於表示頂點間的距離。
(4)圖在程序中表現爲特殊的數據類型