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