64.《oj-圖緒論》

不爱美女爱辣条發表於2024-10-17

簡單的分為四大點內容

1 概念

有向圖和無向圖
image

完全圖 無向圖 n(n-1)/2條邊 有向圖 n(n-1)條邊 注意要和後面的連通區別開
image

連通圖(無向圖)和強連通圖(有向圖)及其分量 注意 連通即指兩點之間可以連通 如2和3透過1可以連通 區別不同於完全圖 整體就是一個連通分量
image

還有一些小概念:
1.連通圖的生成樹是一個極小連通圖(連通且邊數最少的子圖) 頂點數n 則生成樹含有n-1條邊
2.無向圖的全部頂點度之和等於邊數的2倍
3.有向圖頂點的度為出度和入度之和 全部頂點的出度和入度之和相等
4.稠密圖(鄰接矩陣法 Prim演算法) 稀疏圖(鄰接表法 Kruskal演算法)
5.若一個圖有n個頂點且有大於n-1條邊 此圖一定有環
6.頂點不重複出現的路徑稱為簡單路徑

看一些考題:

一個有28條邊的非連通無向圖至少有幾個頂點
image

具有6個頂點的無向圖 當有幾條邊時可以確保為一個連通圖
同上面一個題一樣就是反過來了
image

無向圖有23條邊 度4的頂點5個 度3的4個 其餘都是度2的頂點 則含有多少個頂點
這個利用的就是第2條知識點:無向圖的全部頂點度之和等於邊數的2倍
23x2-4x5+3x4=14 14/2=7 7+5+4=16個

如下圖有向圖 有幾個強連通分量
強連通分量即有向圖的極大強連通子圖
image


2 鄰接矩陣法(二維陣列儲存)和鄰接表法(鏈式儲存)

兩張圖搞定:
image
image

總結的一些小技巧:
1.對於無向圖鄰接矩陣 頂點的度為一行非0元素的個數 即相關邊的個數
2.對於無向圖鄰接表 頂點的度對應一行邊表結點數
3.對於有向圖鄰接矩陣 頂點的度為一行一列非0元素之和
4.對於有向圖鄰接矩陣 頂點出度為一行非0元素之和 入度為一列非0元素之和
5.對於有向圖鄰接表 容易算出頂點的出度
6.無向圖的鄰接矩陣一定是一個對稱矩陣
7.無論有向圖還是無向圖 鄰接矩陣都唯一
8.無向圖 儲存空間為O(|V|+2|E|)  V頂點集 E邊集
9.無向圖 儲存空間為O(|V|+|E|)
10.不太考察的 十字連結串列(有向圖) 鄰接多重表(無向圖)

很抽象吧 直接做題就能很容易理解:

若圖鄰接矩陣中主對角線上元素皆為0 其他皆為1 則該圖一定是...
每兩個相連 為完全圖
image
每個頂點的度是多少
先判斷是無向圖還是有向圖 然後再求解
image


3 廣度優先搜尋(BFS) 深度優先搜尋(DFS)

這個無法寫出來 只能圖來表示更容易理解
1.BFS類似於二叉樹的層序遍歷
2.DFS類似於數的先序遍歷(遞迴演算法)
3.BFS和DFS演算法時間複雜度 基於鄰接矩陣時O(|V|^2) 基於鄰接表時O(|V|+|E|)
4.基於鄰接矩陣的遍歷得到的BFS和DFS序列唯一
5.基於鄰接表遍歷得到的BFS和DFS序列不唯一

無向圖G=(V,E) V={a,b,c,d,e,f} E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)} 則從a開始進行深度優先遍歷 得到的頂點序列為
最好的方式就是根據以上資訊畫出無向圖G 當然也可以透過選項快速排除
例如:abecdf 錯誤 abe 和e相連的且沒有訪問過的只有d 所以錯誤
acfebd acf 和f相連且沒有訪問過的只有d 所以錯誤

如下圖 深度優先遍歷得到的不同個數為幾個
image

以下鄰接表 畫出其深度優先生成樹和廣度優先生成樹
image
image


4 最小生成樹 最短路徑 拓撲排序

最小生成樹:
1.當存在權值相同的邊 最小生成樹可能不唯一
2.當各邊權值互不相等 最小生成樹唯一
3.Prim演算法Kruskal演算法
4.Prim演算法時間複雜度 O(|V|^2)
5.Kruskal演算法時間複雜度 O(|E|log2為底|E|)
Prim演算法Kruskal演算法(最小生成樹)

Prim演算法 就是找頂點集合 然後加入距離最近的頂點(選頂點)
注意要加入選取的是未選取過的頂點
image

Kruskal演算法 就是選邊集合 加入兩邊的頂點(選邊)
注意選取的邊兩端頂點是不在一個連通分量裡的
image

題目:

15統考真題 帶權最小代價(生成)樹 可能是Kruskal演算法第2此選中但不是Prim演算法(從V4開始)第2次選中的邊是()
image

Kruskal演算法和Prim演算法下面無向圖的最小生成樹
image
image
image

最短路徑
1.單源最短路徑:某一頂點到其他各頂點的最短路徑 Dijkstra演算法
2.每對頂點間的最短路徑 Floyd演算法
3.Dijkstra演算法不適用於邊上帶負權值
4.Floyd演算法不適用於包含總權值為負的迴路
5.Dijkstra演算法時間複雜度 O(|V|^2)
6.Floyd演算法時間複雜度 O(|V|^3)

Dijkstra演算法對於有向帶權圖 從源點a到其他各頂點最短路徑 第一條最短路徑目標頂點b 第二條為c 其餘最短路徑目標頂點依次是
就是不斷的找最短路徑 然後一直往下找 順便更新最短路徑
image

Floyd演算法基本很簡單 也不怎麼考察
肉眼就可以觀察出來任意兩點的最短路徑
image

題目:

2021統考真題 使用Dijkstra演算法從頂點1到其餘各頂點的最短路徑 將當前找到的從頂點1到頂點2,3,4,5最短路徑長度儲存在陣列dist中 求出第二條最短路徑後 dist內容更新為什麼
image

拓撲排序(有向無環圖)
1.拓撲排序的結果可能不唯一
2.對於一般圖來說 若其鄰接矩陣是三角矩陣 則存在拓撲序列
3.拓撲排序的步驟就是 找入度為0的頂點刪除相關有向邊 依次往下進行直到沒有頂點
4.逆拓撲排序就是反過來 找出度為0的頂點倒退刪除

直接看題:

下圖進行拓撲排序 可得到不同的拓撲序列個數是多少
image

關於拓撲排序說法錯誤的
1.強連通圖(頂點數大於1)不能進行拓撲排序
2.一個有向圖的拓撲序列中 若頂點a在b之前 圖中必有一條弧<a,b>
image

結束!!!