文章首先於微信公眾號:幾何思維,關注第一時間獲取更新資訊
圖論是計機算演算法中很重要的一種思想,很多的實際問題都可以通過圖論建模來解決。本文先介紹基本的圖論相關知識,為後續講解具體的圖論演算法做鋪墊,如最大匹配,最小生成樹,最短路,網路流,差分約束,拓撲序等。
1 圖定義
圖的表示:G=(V,E), V=(v|v為圖中的頂點), E=(e|e為圖中的邊)
如下圖:點集V:a,b,c,d,e,邊集E:1,2,3,4,5

2 分類
可分為有向圖和無向圖

3 儲存
分鄰接矩陣和鄰接表:
- 鄰接矩陣,一般用二維陣列實現,對於不帶權的圖,也可以用n(row)個m(column)位二進位制數來表示;
空間由點決定,適用點少、邊多的稠密圖 - 鄰接表,一般用連結串列實現;
空間由邊決定,適用邊少、點多的稀疏圖
如上圖中,無向圖用鄰接矩陣儲存,有向圖用鄰接表儲存。

變數定義
// 鄰接矩陣
int map[100][100];
// 鄰接表
struct ENode{
int adjvex;
int weight;
ENode *next;
}
struct VNode{
int vertex;
ENode *edge;
}
VNode adjList[100];
4 簡單圖與多重圖
無向圖中,關聯一對頂點的邊多於一條,稱為平行邊。有向圖中,關聯一對頂點的邊多於一條,且方向相同,也稱為平行邊。
多重圖:含平行邊或自環邊的圖。
簡單圖:既不含平行邊,也不含自環邊。

5 完全圖
每對頂點之間都恰有一條邊的簡單圖,n個頂點的完全圖,共有n(n-1)/2條邊。

6 獨立集
獨立集:圖中兩兩互不相鄰的頂點構成的集合,為圖G的頂點集的子集。
極大獨立集:圖的一個獨立集,且不是其他任一獨立集的真子集。
最大獨立集:頂點數最多的獨立集。頂點個數稱為圖G的獨立數,記為α(G)。
如下圖:
獨立集:[a,c],[a,e],[b,c],[b,e],[b,d],[c,e],[a,c,e],[b,c,e]
極大獨立集:[b,d],加入任何點都無法構成獨立集;而[a,c]不是極大獨立集,還可以加入e構成更大的獨立集[a,c,e]
最大獨立集:[a,c,e],[b,c,e]

7 團
團:圖G的一個完全子圖。
極大團:圖的一個團,且不是其他任一團的真子集。
最大團:頂點數最多的團。
如下圖:
團:[a,b],[a,d],[c,d],[c,e],[d,e],[c,d,e]
極大團:[a,b],[a,d],[c,d,e]
最大團:[c,d,e]

8 補圖
定義:圖G的完全圖去除G的邊集後得到的圖。

9 最大獨立集也最大團
獨立集是任意兩點不相鄰,而團是任意兩點相鄰。圖G的補圖是去掉了相連的邊,新增不相鄰的邊。這樣圖G的最大獨立集就可以轉化成補圖的最大團。
如下圖:


10 連通圖
圖中從一個頂點到達另一頂點,若存在至少一條路徑,則稱這兩個頂點是連通的。
無向圖中,如果任意兩個頂點之間都能夠連通,則稱此無向圖為連通圖。

無向圖G的一個極大連通子圖稱為G的一個連通分量。

有向圖中,如果任意兩個頂點之間都存在路徑,則稱此有向圖為強連通圖。

有向圖的極大強連通子圖,稱為強連通分量。

n個頂點的強連通圖,邊數最多為n(n-1),最少為n。

11 二分圖
定義:設G=(V,E)是一個無向圖,頂點集V可分割為兩個互不相交的子集,並且圖中每條邊關聯的兩個頂點都分屬於這兩個互不相交的子集,兩個子集內的頂點不相鄰。

充要條件:G至少有兩個頂點,且其所有迴路的長度均為偶數。
判斷方法:染色法
- 開始對任意一未染色的頂點染色
- 判斷其相鄰的頂點中,若未染色則將其染上和相鄰頂點不同的顏色;
- 若已經染色且顏色和相鄰頂點的顏色相同則說明不是二分圖,若顏色不同則繼續判斷
可用bfs或者dfs。

掃描下方二維碼關注公眾號,第一時間獲取更新資訊!
