這篇只是作為學習筆記之用,記錄復習中的一些知識,算法設計也均是偽代碼表示,如果你想要找代碼實現就不必看這些內容了,不過如果想要簡單回顧一下相關知識還是可以瀏覽一下的。如果時間不倉促每個算法實現一下還是挺好的,不過這都是考試結束之后的事情了~
圖的分類
圖分為有向圖和無向圖,兩種都可以表示為G={V,E},分別是頂點和邊,有向無向均是針對邊來說的。
下面的lgE=lgV是同一個數量級的這個在最小生成樹算法的算法復雜度分析中比較重要,所以這里羅列出來。

圖的兩種表示方法
圖的表示方法有兩種,鄰接鏈表和鄰接矩陣:
鄰接鏈表有一個握手定理,就是遍歷鄰接表中所有點的鄰接點,在無向圖中需要2E次,有向圖中需要E次。這里在圖的算法分析中還是比較重要的。如下:

留下兩個思考題:
針對鄰接矩陣表示的圖和鄰接鏈表表示的圖G,進行反轉的時間復雜度分別是多少呢?
針對鄰接矩陣,直接進行0轉1,1轉0即可,時間復雜度矩陣的大小;
但是鄰接鏈表?我自己的思路是重新構造一個鄰接鏈表,新的鏈表頂點,針對頂點1,把它加入到其后鄰接點的作為頂點,依次類推,這個時間復雜度為E;
針對鄰接矩陣表示的圖和鄰接鏈表表示的圖G,將圖中路徑為長度為2的點進行連接這種圖的變換的時間復雜度分別是多少呢?
針對鄰接矩陣,同樣比較簡單,直接將矩陣平方即可,時間復雜度為矩陣乘法的時間復雜度;
鄰接鏈表也只是我個人理解的一個思路:重新構造一個鄰接鏈表,第一個遍歷鏈表后面元素的鏈表...有點繞,但是就是頂點的鄰接頂點作為頂點的鄰接頂點,但是要有去重的工作,沒有去重則為2E;以上僅是我個人理解,有什么不對可以反饋。
廣度優先搜索
圖的搜索算法都是根據標記顏色來進行的,接下來的深度優先搜索也是有顏色的標記。
偽代碼:
BFS(G,s)
for each vertex u in V[G]-s
color[u]=white
father[u]=NIL
depth[u]=MAX
color[s]=gray
depth[s]=0
father[s]=NIL
Q=NULL
ENQUEUE(Q,s)
while(Q!=NULL)
u=DEQUEUE(Q)
for each v in Adj[u]
if color[v]=white
color[v]=gray
depth[v]=depth[u]+1
father[v]=u
ENQEUE(Q,v)
color[u]=black
時間復雜度分析

廣度優先樹
廣度優先搜索形成一個樹的結構,其定義如下由上面形成的father結構形式

可以遞歸的輸出廣度優先樹的到達開始節點的路徑,這個路徑也是最短路徑。
BFS思考題:

思路一:一個點BFS找到一個最遠的點,然后從這個最遠的點開始BFS,到達的最遠的一個點的距離及為直徑
思路二:根據根節點分為左子樹和右子樹,然后左子樹的高度+1+右子樹的高度為直徑?
深度優先搜索
深度優先搜索有一個時間戳的標識
深度優先搜索一般截圖圖的連通問題~!
偽代碼:
DFS(G)
for each u in V[G]
color[u]=white
father[u]=NIL
time=0
for each u in V[G]
if color[u]=white
DFS-VISIT(u)
DFS-VISIT(u)
color[u]=gray
d[u]=time=time+1
for each v in Adj[u]
if color[v]=white
father[v]=u
DFS-VISIT(v)
color[u]=black
f[u]=time=time+1
時間復雜度:
DFS的兩個性質:
時間包含,子節點和完全包含是充要條件

白色路徑定理,后面的證明會用到

DFS中碰到的四種邊的分類以及識別算法:

算法思想描述:可以對算法DFS做一些修改,使之遇到圖中的邊時,對其進行分類,算法核心思想在對於每條邊u,v,當該邊被第一次尋到時,根據所到達頂點的顏色,對其分類。
1、白色的表明是樹邊
2、灰色的表明是回邊
3、黑色的表明是正向邊或者交叉邊
如果du<dv正向邊,du>dv交叉邊
拓撲排序:
偽代碼:

強連通分量識別:
偽代碼:

最小生成樹


算法時間復雜度分析:



算法時間復雜度分析:


最后太倉促了,本來寫好了,電腦又藍屏了,導致就草草的收尾了,真是可惜哪些寫過的,要考試了還是花時間多復習一下。
