數據結構-圖的總結


一.思維導圖
二.重要概念的筆記:
1.頂點的度、入度、出度:頂點的度是指依附於某頂點Vi的邊數,通常記為TD(Vi);
頂點的入度(InDegree)是指以Vi為終點的弧的而數目,記為ID(Vi);
頂點的出度(OutDegree)是指以Vi為始點的弧的數目,記為OD(Vi);
於是有:TD(Vi) = ID(Vi)+OD(Vi);
2. 完全圖:若無向圖中的每兩個頂點之間都存在着一條邊,有向圖中的每兩個頂點之間都存在着方向相反的兩條邊,則稱此圖為完全圖;無向完全圖包含有n(n-1)/2條邊,有向完全圖包含有n(n-1)條邊。
3.有向圖:圖中任意兩個頂點之間的邊都是有向邊(頂點v到w之間的邊有方向。有向邊也稱為弧(Arc),用有序偶對(v, w)表示。 v稱為弧尾或初始點,w稱為弧頭或終點)。如:

4.無向圖:圖中任意兩個頂點之間的邊都是無向邊(頂點v到w之間的邊沒有方向。用無序偶對(v, w)表示)。如:

5.完全圖:若無向圖中的每兩個頂點之間都存在着一條邊,有向圖中的每兩個頂點之間都存在着方向相反的兩條邊,則稱此圖為完全圖。
1)有向完全圖:在一個具有n頂點的有向圖中,最多可能有n(n-1)條弧,具有n(n-1)條弧的n個頂點的有向圖稱為完全有向圖,如:

2)無向完全圖:在一個具有n個頂點的無向圖中,倘若每個頂點與其他n-1個頂點之間都有邊相連,則會有n(n-1)/2條邊,這是具有n個頂點的無向圖可能的最大邊數。一個具有n(n-1)/2條邊的n個頂點的無向圖被稱為無向完全圖。如:

6.稠密圖和稀疏圖:
稠密圖:當一個圖接近完全圖時,如:

稀疏圖:當一個圖含有較少的邊數,如:

7.子圖:
設有兩個圖G=(V,E)和G'=(V',E'),若V'是V的子集,且E'是E的子集,則稱G'是G的子圖
說明:圖G的子圖一定是個圖,所以並非V的任何子集V'和E的任何子集E'都能構成G的子圖,因為這樣的(V',E')並不一定構成一個圖。
8.連通、連通圖和連通分量
在無向圖中,若從頂點v 到頂點w 有路徑存在,則稱v 和w 是連通的。若圖G 中任意兩個頂點都是連通的,則稱圖G 為連通圖,否則稱為非連通圖。無向圖中的極大連通子圖稱為連通分量。若一個圖有n 個頂點,並且邊數小於n−1,則此圖必是非連通圖。
9.強連通圖和強連通分量
在有向圖G中,若從頂點i到頂點j有路徑,則稱從頂點i到頂點j是連通的,若圖G中的任意兩個頂點i和j都連通,即從頂點i到頂點j和從頂點j到頂點i都存在路徑則稱途徑是強連通圖。
注:強連通圖只有一個強連通分量(即它本身)。
在一個非常連通圖中找強連通分量的方法如下 :
(1)在圖中找有向環。
(2)拓展該有向環:如果某個頂點到該環中的任何一項頂點都有路徑,並且該環中的任一頂點到這個頂點也有路徑,則加入這個頂點。
10.權和網
圖中的每一條邊都可以附有一個對應的數值,這種與邊相關的數值稱為權。權可以表示從一個頂點到另一個頂點的距離或花費的代價。邊上帶有權的圖稱為帶權圖,也稱作網。如:

圖的存儲結構和基本運算算法
一.鄰接矩陣存儲方法:圖的鄰接矩陣(Adjacency Matrix) 存儲方式是用兩個數組來表示圖。一個一維數組存儲圖中頂點信息,一個二維數組(稱為鄰接矩陣)存儲圖中的邊或弧的信息。
設圖G有n個頂點,則鄰接矩陣A是一個n*n的方陣,定義為:

下圖是一個無向圖和它的鄰接矩陣:

可以看出:
1.無向圖的鄰接矩陣一定是一個對稱矩陣(即從矩陣的左上角到右下角的主對角線為軸,右上角的元與左下角相對應的元全都是相等的)。 因此,在實際存儲鄰接矩陣時只需存儲上(或下)三角矩陣的元素。
2.對於無向圖,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數正好是第i個頂點的度TD(vi),比如頂點v1的度就是1+0+1+0=2.
3.求頂點vi的所有鄰接點就是將矩陣中第i行元素掃描一遍,A[i][j]為1就是鄰接點。

下圖是有向圖和它的鄰接矩陣:

可以看出:
1.主對角線上數值依然為0。但因為是有向圖,所以此矩陣並不對稱。
2.有向圖講究入度與出度,頂點v1的入度為1,正好是第v1列各數之和,頂點v1的出度為2,即第v1行的各數之和。
3.與無向圖同樣的辦法,判斷頂點vi到vj是否存在弧,只需要查找矩陣中A[i][j]是否為1即可。

通過以上對無向圖、有向圖和網的描述,可定義出鄰接矩陣的存儲結構:
#define MaxVertexNum 100; //頂點數目的最大值 typedef char VertexType; //頂點的數據類型 typedef int EdgeType; //帶權圖中邊上權值的數據類型 typedef struct{ VertexType Vex[MaxVertexNum]; //頂點表 EdgeType Edge[MaxVertexNum][MaxVertexNum]; //鄰接矩陣,邊表 int vexnum, arcnum; //圖的當前頂點數和弧樹 }MGraph;

二.鄰接表
圖的鄰接表是一種順序與鏈式存儲相結合的存儲方法。在鄰接表中有兩種類型的結點,一種是頭結點,其個數恰好為圖中頂點的個數;另一種是邊結點,也就是單鏈表中的結點。對於無向圖,這類結點的個數等於邊數的兩倍;對於有向圖,這類結點的個數等於邊數。
圖的完整鄰接表存儲類型的聲明如下:
typedef struct ANode //邊結點; { int adjvex;//指向該邊的終點編號; struct ANode*nextarc;//指向下一個鄰接點; INfoType info;//保存該邊的權值等信息; }ArcNode; typedef struct Vnode //頭結點 { int data;//頂點; ArcNode *firstarc;//指向第一個鄰接點; }VNode; typedef struct { VNode adjlist[MAX];//鄰接表; int n,e;//圖中頂點數n和邊數e; }AdjGraph;//完整的圖鄰接表類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM