圖——圖的定義與操做

1,樹中結點能夠有多個後繼,而每一個結點都只有一個直接前驅,所以造成了一種層次結構;若是樹中的每一個結點也能夠有多個直接前驅,那麼這種層次結構都被破壞了;這樣就會造成網狀結構,會是一種新的數據結構,圖;數據結構

  

2,圖的定義:this

       1,圖是由頂點集合(Vertex)及頂點間的關係集合(Edge)組成的一種數據結構 Graph = (V, E),其中,V = {x | x 屬於數據對象},是頂點的有窮非空集合(頂點集),E = {(x, y) | x, y 屬於 V } 是頂點之間的關係的有窮集合(邊集,能夠爲空);spa

         

3,無向邊:3d

       1,頂點 x 和 y 之間的邊沒有方向,則稱該邊爲無向邊;指針

       2,(x, y) 與 (y, x) 意義相同,表示 x 和 y 之間有鏈接;code

      

4,無向圖:對象

       1,圖中任意兩個頂點之間的邊均是無向邊,則稱該圖爲無向圖;blog

      

5,有向邊:繼承

       1,頂點 x 和 y 之間的邊有方向,則稱該邊爲有向邊;rem

       2,<x, y> 與 <y, x> 意義不一樣:

              1,<x, y> 表示從 x 鏈接到 y,x 稱爲尾,y 稱爲頭;

              2,<y, x> 表示從 y 鏈接到 x,y 稱爲尾,x 稱爲頭;

             

6,有向圖:     

       1,圖中任意兩個頂點之間的邊均是有向邊,則稱該圖爲有向圖;

      

7,無向圖能夠看做一種特殊的有向圖,後續代碼實現圖的數據結構只考慮有向圖;

 

8,頂點鄰接(Adjacent)的定義:

       1,無向圖:

              1,若是 (x, y) 屬於 E,則稱頂點 x 和 y 互爲鄰接;

       2,有向圖:

              1,若是 <x, y> 屬於 E,則稱頂點 x 鄰接到頂點 y;

             

9,度(Degree)的定義:

       1,頂點 v 的度是和 v 相關聯的邊的數目,記爲 TD(v):

              1,入度:以 v 爲頭的邊的數目,記爲 ID(v);

              2,出度:以 v 爲尾的邊的數目,記爲 OD(v);

       2,推論:

           

          

10,權(Weight)的定義:

 

       1,與圖的邊相關的數據元素叫作權;

       2,權經常使用來表示圖中頂點間的距離或者耗費;

      

11,圖的一些經常使用的操做:

       1,設置頂點的值;

       2,獲取頂點的值;

       3,獲取鄰接頂點;

       4,設置邊的值;

       5,刪除邊;

       6,獲取頂點數;

       7,獲取邊數;

      

12,圖在程序中表現爲一種特殊的數據類型:

 

 

13,圖抽象類的建立:

 1 #ifndef GRAPH_H
 2 #define GRAPH_H
 3 
 4 #include "Object.h"
 5 
 6 using namespace std;
 7 namespace DTLib
 8 {
 9 
10 /* 設置邊的數據結構,用於鄰接鏈表 */
11 template < typename E >
12 struct Edge : public Object
13 {
14    int b;  // 起點
15    int e;  // 終點
16    E data;  // 權值
17 
18    Edge(int i=-1, int j=-1)
19    {
20        b = i;
21        e = j;
22    }
23 
24    Edge(int i, int j, const E& value)
25    {
26        b = i;
27        e = j;
28        data = value;
29    }
30 
31    /* 相等和不等不須要對權值進行比價,只比較起始點位置,刪除頂點操做中查找操做用到,在此處定義了 */
32    bool operator == (const Edge<E>& obj)
33    {
34        return (b == obj.b) && (e == obj.e);
35    }
36 
37    bool operator != (const Edge<E>& obj)
38    {
39        return !(*this == obj);
40    }
41 
42    bool operator < (const Edge<E>& obj)
43    {
44        return (data < obj.data);  // 權值比較邊的大小
45    }
46 
47    bool operator > (const Edge<E>& obj)
48    {
49        return (data > obj.data);  // 權值比較邊的大小
50    }
51 };
52 
53 /* 抽象類不可以用來繼承,能用來定義指針 */
54 template < typename V, typename E >
55 class Graph : public Object
56 {
57 public:
58     virtual V getVertex(int i) = 0;  // V 表示與頂點相關聯的數據類型
59     virtual bool getVertex(int i, V& value) = 0;
60     virtual bool setVertex(int i, const V& value) = 0;
61     virtual SharedPointer< Array<int> > getAdgacent(int i) = 0;
62     virtual bool isAdjacent(int i, int j) = 0;//i和j 是否鏈接,只能在繼承中實現
63     virtual E getEdge(int i, int j) = 0;// E表示與邊相關聯的數據類型,獲得邊上的//權值
64     virtual bool getEdge(int i, int j, E& value) = 0;
65     virtual bool setEdge(int i, int j, const E& value) = 0;
66     virtual bool removeEdge(int i, int j) = 0;
67     virtual int vCount() = 0;
68     virtual int eCount() = 0;
69     virtual int OD(int i) = 0;
70     virtual int ID(int i) = 0;
71     virtual int TD(int i)  // 頂點 i 的度,即與頂點 i 相關聯的邊的數目
72     {
73         return OD(i) + ID(i);  // 出度加上入度
74    }
75 };
76 }
77 #endif // GRAPH_H

 

14,小結:

       1,圖是頂點與邊的集合,是一種非線性的數據結構;

       2,圖中頂點能夠與多個其餘頂點產生鄰接關係;

  3,圖中的邊有與之對應的權值,表示頂點間的距離;

       4,圖在程序中表現爲特殊的數據類型;

相關文章
相關標籤/搜索