分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...
圖:
圖結(jié)構(gòu)區(qū)別于線性結(jié)構(gòu)和樹型結(jié)構(gòu),區(qū)別可見下圖
邏輯上的圖(graph)結(jié)構(gòu)由頂點(vertex)和邊(edge)組成。
一個圖結(jié)構(gòu)G包含頂點集合V和邊集合E,任何兩個頂點之間可以有一個邊表示兩者的關(guān)系。
對于一個存在的G,V不可以為空集,E可以為空集。
左中右分別都是圖結(jié)構(gòu)與圖相關(guān)的概念:
有向圖:
邊都具有方向的圖結(jié)構(gòu)就是有向圖結(jié)構(gòu)。邊的方向表示訪問的方向。
有向無環(huán)圖:
對于一個有向圖,如果對于任意一個節(jié)點來說,從該這一個結(jié)點起,不存在路徑使得可以重新回到這一結(jié)點上,這個有向圖就是有向無環(huán)圖。
有向有環(huán)圖:
與有向無環(huán)圖相反。
入度,出度:
這一概念只適用于有向圖。對于有向圖種,一個指向一個頂點的邊數(shù)量稱為個頂點的入度,從這個頂點指出的邊的數(shù)量稱為這個頂點的出度。
11這一頂點的入度是2,出度為3無向圖:
無向圖中,連接兩個頂點的邊是沒有方向的,可以在邏輯上認為是兩個頂點間如果有邊直接連通,則一定兩個方向都有的有向圖。
混合圖:
混合圖種既存在有向邊,也存在無向邊。
簡單圖、多重圖:
如果在無向圖中,直接連通兩個頂點的邊大于等于2條,這些邊稱為平行邊。
如果在有向圖中,直接連通兩個頂點的同方向的邊大于等于2條,這些邊稱為平行邊。
如果在圖中一條邊直接連通同一個頂點,就成為自環(huán)。
如果在圖結(jié)構(gòu)中存在平行邊或者自環(huán),這個圖就稱為多重圖,如果兩者都不存在,那么稱為簡單圖。
無向完全圖、有向完全圖:
如果在無向圖中任意兩個頂點之間都存在直接連通兩個頂點的邊,那么這個無向圖就成為無向完全圖。
如果在有向圖中任意兩個頂點之間都存在方向相反的直接連通兩個頂點兩個邊,那么這個有向圖就成為有向完全圖。
無向完全圖有向完全圖稠密圖、稀疏圖:
邊數(shù)接近于完全圖的圖就是稠密圖,邊數(shù)遠遠少于完全圖的圖就是稀疏圖。
有權(quán)圖:
連接頂點的邊上帶有權(quán)值的圖稱為有權(quán)圖
連通圖:
如果無向圖中任意兩個頂點都可以連通,無論是間接還是直接,那么這個無向圖稱為連通圖。
連通圖連通分量:
連通分量就是無向圖中的最大連通子圖數(shù)量,也就是一個無向圖分出來的最多的互不連通的部分。對于一個連通圖來說,連通分量為1。
強連通圖:
強連通圖就是對有向圖定義的連通圖。
強連通圖強連通分量:
同無向圖的連通分量概念。
圖的實現(xiàn):
圖一般有兩種實現(xiàn)方法,一種是鄰接矩陣,還有一種是鄰接表,鄰接矩陣實際操作比較復(fù)雜,這里主要寫鄰接表的代碼實現(xiàn)。
圖的鄰接矩陣實現(xiàn):
無向圖
有向圖
圖的鄰接表實現(xiàn):
圖的鄰接表實現(xiàn)主要是分別將結(jié)點和邊存放在結(jié)構(gòu)體中,再以一定的方式將這些結(jié)構(gòu)聯(lián)系起來。以下實現(xiàn)代碼主要使用哈希map來實現(xiàn)有向有權(quán)圖,代碼總體還是以表現(xiàn)思路為主。
//有向有權(quán)圖的頂點結(jié)構(gòu),假定頂點存儲的元素為int類型圖的遍歷:
廣度優(yōu)先搜索(BFS):
廣度優(yōu)先搜索類似于二叉樹的層序遍歷。從一個指定的頂點開始,將指定的頂點視作邏輯上的第一層,指定的頂點所連通的頂點視作邏輯上的第二層,指定的頂點所聯(lián)通的頂點所連通的頂點視作邏輯上的第三層,以此類推依次遍歷,直到遍歷完所有頂點。
BFS的一種情況//圖結(jié)構(gòu)的廣度優(yōu)先遍歷由以上的廣度優(yōu)先遍歷實現(xiàn)代碼可知,廣度優(yōu)先遍歷上邏輯上下一層的元素一定是再當前層元素之后被訪問,但是邏輯上同一層的元素的訪問先后次序沒有規(guī)律,這取決于outEdges這一set結(jié)構(gòu)中的存儲順序。
深度優(yōu)先搜索(DFS):
深度優(yōu)先搜索的思路類似于二叉樹的先序遍歷,從指定的頂點開始,訪問該頂點后繼續(xù)訪問該頂點的邏輯上下一層的第一個頂點,以此類推直到不存在下一層的頂點,那就返回倒數(shù)第二層層的第二個頂點的位置繼續(xù)重復(fù)以上操作,直到所有的頂點都被遍歷。
DFS的一種情況//圖的深度優(yōu)先遍歷有向圖的應(yīng)用:AOV網(wǎng)(Activity On Vertex Network)
一項大的工程經(jīng)常被分為多個小的子工程,多個子工程之間可能存在一定的先后順序,也就是說某些子工程必須在其他子工程完成后才能開始。因此,在現(xiàn)代化管理中,人們常用有向圖來描述和分析一項大工程的計劃和實施過程,子工程被稱為活動(Activity),在有向圖中用頂點來表示,有向邊表示活動之間的向后關(guān)系,這樣的圖結(jié)構(gòu)稱為AOV網(wǎng)。
結(jié)構(gòu):
標準的AOV網(wǎng)結(jié)構(gòu)是一個有向無環(huán)圖。
拓撲排序:
將AOV網(wǎng)中的所有頂點按活動的發(fā)生順序排成一個序列,該序列一定滿足活動發(fā)生的先后順序,但同一優(yōu)先級的活動的順序不一定。比如說下圖的排序結(jié)果是ABCDEF或者ABDCEF。
用卡恩算法實現(xiàn)AOV網(wǎng)的拓撲排序:
算法實現(xiàn)(僅僅體現(xiàn)思路)
//假定之前寫的Graph就是AOV結(jié)構(gòu)總結(jié)
以上是生活随笔為你收集整理的分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rds for mysql的监控指标_m
- 下一篇: 32g内存 android开发,16G走