導航:首頁 > 源碼編譯 > 圖演算法與圖論

圖演算法與圖論

發布時間:2023-01-08 18:45:56

㈠ 圖論演算法的教材

我想很多學習圖論的人都知道J.A. Bondy和U.S.R. Murty著的《Graph Theory with Application》(Elsevier,1976)是圖論教材中的經典,時至今日,仍不失為初學者較好的入門書。還記得蘭州交通大學的張忠輔教授說過,國內第一屆圖論學會就是把大家集中起來學習邦迪的《Graph Theory with Application》,由此可見這本書對國內圖論屆的影響是如此之大。吳望名等人將其譯成中文版本《圖論及其應用》(北京:科學出版社,1984),1988年張克民等人編寫了該書的參考答案《圖論及其應用習題解答》(清華大學出版社,1988)。
在2008年J.A. Bondy和U.S.R. Murty出了新書《Graph Theory》(GTM 244, Springer, 2008), 大家可不妨將其看成是《Graph Theory with Application》的第二版,這本書在內容上做了重新調整,畢竟在第一版出版後的近30年裡涌現出了很多新的結果,所以《Graph Theory》在內容上加進了一些新的結果,這本書我只是讀了其中的幾章,覺得寫的非常棒,建議大家能夠讀讀,這里也值得一提的是將第一版最後提出的50個問題進行了更新,並補充了一些新的問題。總之,我個人認為,《Graph Theory》的確是一部很優秀的圖論教材。
中國科學技術大學出版社出版的《圖論及其演算法》,融有向圖和無向圖為一整體,系統地闡述了圖論的基本概念、理論、方法及其演算法,內容包括圖的基本概念、Euler圖與Hamilton圖、圖論演算法、樹及其應用、平面圖、獨立集與匹配、網路流和Petri網。 書中附有大量例題和習題,而且大部分習題有詳細解答。 該書選材精煉全面,內容處理恰當且有新意,立論嚴謹,敘述條理清晰,語言流暢。 該書可用作高校計算機、電子、信息、管理、數學等專業本科生必修課教材,也可供相關專業的研究人員、教師及圖論工作者參考。

㈡ 圖論演算法及其MATLAB實現的圖書目錄

第1章 圖論的基礎知識1
1.1圖論的起源1
1.2著名的圖論學者——歐拉1
1.3圖2
1.4特殊圖類3
1.5有向圖4
1.6圖的矩陣表示5
1.6.1鄰接矩陣5
1.6.2關聯矩陣5
1.7圖論的基本性質和定理6
1.8計算有向圖的可達矩陣的演算法及其MATLAB實現6
1.9關聯矩陣和鄰接矩陣的相互轉換演算法及其MATLAB實現7
習題一11
第2章 最短路12
2.1路12
2.2最短路問題13
2.3求連通圖最短距離矩陣的演算法及其MATLAB實現14
2.4求兩點間最短路的Dijkstra演算法及其MATLAB實現15
2.4.1 Dijkstra演算法16
2.4.2 Dijkstra演算法的MATLAB實現16
2.5求兩點間最短路的改進的Dijkstra演算法及其MATLAB實現18
2.5.1 Dijkstra矩陣演算法Ⅰ18
2.5.2 Dijkstra矩陣演算法Ⅱ18
2.6 求兩點間最短路的WarshallFloyd演算法及其MATLAB實現21
2.6.1 Floyd演算法的基本思想22
2.6.2 Floyd演算法的基本步驟22
2.6.3 WarshallFloyd演算法的MATLAB實現22
2.7求任意兩點間最短路的演算法及其MATLAB實現25
2.8求從一固定點到其他所有點最短路的演算法及其MATLAB實現27
2.9求必須通過指定兩個點的最短路的演算法及其MATLAB實現29
2.10求圖的兩頂點間最短路與次短路的演算法及其MATLAB實現32
2.11求最大可靠路的演算法及其MATLAB實現34
2.12求最大期望容量路的演算法及其MATLAB實現36
習題二38
第3章 連通圖40
3.1判斷圖的連通性演算法及其MATLAB實現40
3.2連通圖的中心和加權中心的演算法及其MATLAB實現42
3.3連通無向圖一般中心的演算法及其MATLAB實現44
習題三46
第4章 樹48
4.1樹及其性質48
4.2割點、割邊、割集50
4.3二元樹與Huffman樹51
4.3.1有序二元樹51
4.3.2 Huffman樹51
4.4求Huffman樹及其MATLAB實現52
4.5廣度優先搜索演算法及其MATLAB實現55
4.6深度優先搜索演算法及其MATLAB實現57
4.7求割點演算法及其MATLAB實現61
4.8生成樹及其個數65
4.9求無向圖的生成樹演算法及其MATLAB實現67
4.10求有向圖的生成樹演算法及其MATLAB實現69
4.11求有向連通圖的外向樹與內向樹數目的演算法及其MATLAB實現71
4.12最小生成樹問題73
4.13求最小生成樹的Kruskal演算法及其MATLAB實現74
4.13.1 Kruskal演算法的基本思想74
4.13.2 Kruskal演算法的MATLAB實現74
4.14求最小生成樹的Prim演算法及其MATLAB實現76
4.14.1 Prim演算法的基本思想76
4.14.2 Prim演算法的MATLAB實現77
習題四79
第5章Euler圖和Hamilton圖81
5.1 Euler圖81
5.2「一筆畫」問題及其理論81
5.3中國郵遞員問題82
5.4 Fleury演算法及其MATLAB實現82
5.4.1 Fleury演算法的步驟82
5.4.2 Fleury演算法的MATLAB實現82
5.5 Hamilton圖87
5.6旅行售貨員問題88
5.7改良圈演算法及其MATLAB實現89
習題五92
第6章 匹配問題及其演算法93
6.1問題起源——婚配問題93
6.2二分圖的有關知識93
6.3匹配、完美匹配、最大匹配93
6.4匹配的基本定理94
6.5應用案例——BernolliEuler錯放信箋問題95
6.6尋求圖的一個較大基數匹配演算法及其MATLAB實現95
6.7人員分配問題97
6.8匈牙利演算法及其MATLAB實現97
6.8.1匈牙利演算法基本步驟97
6.8.2匈牙利演算法的MATLAB實現98
6.8.3案例及其MATLAB實現100
6.9最優分配問題101
6.10 KuhnMunkres演算法及其MATLAB實現101
6.10.1 KuhnMunkres演算法的基本思想101
6.10.2利用可行頂點標記求最佳匹配的KuhnMunkras演算法步驟102
6.10.3 KuhnMunkres演算法的MATLAB實現102
6.10.4簡單實驗105
習題六107
第7章 網路流的演算法108
7.1網路、流和割108
7.1.1網路和流108
7.1.2割109
7.2網路的最大流問題110
7.3最大流最小割定理110
7.4 FordFulkerson標號演算法及其MATLAB實現111
7.4.1 FordFulkerson標號演算法的基本步驟111
7.4.2 FordFulkerson 標號演算法的MATLAB實現112
7.4.3案例及其MATLAB實現113
7.5 Dinic演算法及其MATLAB實現114
7.5.1 Dinic演算法的基本思想114
7.5.2 Dinic演算法的MATLAB實現115
7.5.3案例

㈢ 圖論的基本概念有哪些

圖論基本概念
重要定義:
有向圖:每條邊都是有向邊的圖。
無向圖:每條邊都是無向邊的圖。
混合圖:既有有向邊又有無向邊的圖。
自迴路:一條邊的兩端重合。
重數:兩頂點間若有幾條邊,稱這些邊為平行邊,兩頂點a,b間平行邊的條數成為(a,b)的重數。
多重圖:含有平行邊的圖。
簡單圖:不含平行邊和自迴路的圖。
注意!一條無向邊可以用一對方向相反的有向邊代替,因此一個無向圖可以用這種方法轉化為一個有向圖。
定向圖:如果對無向圖G的每條無向邊指定一個方向由此得到的有向圖D。稱為的G定向圖.
底圖:如果把一個有向圖的每一條有向邊的方向都去掉,得無向圖G稱為的D底圖。
逆圖:把一個有向圖D的每條邊都反向由此得到的圖稱為D的逆圖。
賦權圖:每條邊都賦上了值。
出度:與頂點相連的邊數稱為該定點的度數,以該定點為始邊的邊數為出度。 入度:以該定點為終邊的邊數為入度。
特殊!度數為零的定點稱為孤立點。度數為一的點為懸掛點。
無向完全圖:在階無向圖中如果任何兩點都有一條邊關連則稱此圖是無向完全圖。Kn
完全有向圖:在階有向圖中如果任意兩點都有方向相反的有向邊相連則稱此圖為完全有向圖。
竟賽圖:階圖中如果其底圖是無向完全圖,則程此有向完全圖是竟塞圖。
注意!n階有向完全圖的邊數為n的平方;無向完全圖的邊數為n(n-1)/2。
下面介召圖兩種操作:①刪邊:刪去圖中的某一條邊但仍保留邊的端點。
②刪點:刪去圖中某一點以及與這點相連的所有邊。
子圖:刪去一條邊或一點剩下的圖。
生成子圖:只刪邊不刪點。
主子圖:圖中刪去一點所得的子圖稱的主子圖。
補圖:設為階間單無向圖,在中添加一些邊後,可使成為階完全圖;由這些添加邊和的個頂點構成的圖稱為的補圖。
重要定理:
定理5.1.1 設圖G是具有n個頂點m條邊的有向圖,其中點集V={v,v,….,v}
deg+(vi)=deg-(vi)=m
定理5.1.2 設圖G是具有n個頂點m條邊的無向圖,其中點集V={v,v,v,……,v}
deg(vi)=2m
推論 在無向圖中,度數為積數的頂點個數為偶數。
通路和富權圖的最短通路
1通路和迴路
基本概念:
通路的長度:通路中邊的條數。
迴路:如果通路中始點與終點相同。
簡單通路:如果通路中各邊都不相同。
基本通路:如果通路中各頂點都不相同。顯然(基本通路一定是簡單通路,但簡單通路不一定是基本通路)
可達:在圖G中如果存在一條v到d通路則稱從v到d是可達。
連通:在無向圖中如果任意兩點是可達的,否則是不連通的。
強連通:在有向圖中如果任意兩點是互可達的。
單向連通:在有向圖中如果存在任意兩點的通路。
弱連通:在有向圖中如果其底圖是連通的。
權:在圖的點或邊上表明某種信息的數。
賦權圖:含有權的圖。
賦權圖的最短通路問題的演算法:先求出到某一點的最短通路,然後利用這個結果再去確定到另一點的最短通路,如此繼續下去,直到找到到的最短通路為止。
指標:設V是圖的點集,T是V的子集,且T含有z但不含a,則稱T為目標集。在目標集T中任取一個點t,由a到t但不通過目標集T中其它點所有通路中,個邊權和的最小者稱為點t關與T的指標記作DT(t)。
圖和矩陣
住意兩個的區別:A·A 中元素的意義:當且僅當a 和a 都是1時,a a =1而a 和a 都為1意味著圖G中有邊(v ,v )和(v ,v )。於是可得如下結論:從頂點v 和v 引出的邊,如果共同終止於一些頂點,則這些終止頂點的數目就是b 的值;特別對於b ,其值就是v 的出度。

A ·A中元素的意義:當且僅當a 和a 都為1時,a a =1,這意味著圖中有邊(v ,v )和(v ,v )。於是的得如下結論:從某些點引出的邊,如果同時終止於v 和v ,則這樣的頂點數就是的值。特別對於b ,其值就是的v 入度。

冪A 中元素的意義:當m=1時,a 中的元素=1,說明存在一條邊(v ,v ),或者說從v 到v 存在一條長度為一的通路。

A 中元素a 表示從v 到v 的長度為m的所有通路的數目。
歐拉圖
主要定義:
如果圖中存在一條通過圖中個邊一次且僅一次的迴路,則稱此迴路為歐拉迴路,具有歐拉迴路的圖稱為歐拉圖。

如果圖中存在一條通過圖中各邊一次且僅一次的通路,則稱此迴路為歐拉通路,具有歐拉通路的圖稱為半歐拉圖。

主要定理:一個無向連通圖是歐拉圖的充要條件是圖中各點的度數為偶數。

一個無向連通圖是半歐拉圖的充要條件是圖中至多有兩個奇數度點。

設圖G是有向連通圖,圖G是歐拉圖的充要條件是圖中每個頂點的入度和出度相等。

設圖G是有向連通圖,圖G是半歐拉圖的充要條件是至多有兩個頂點,其中一個頂點入度比它的出度大1,另一個頂點入度比它的出度少1;而其他頂點的入度和出度相等。
哈密頓圖
主要定義:如果圖G中存在一條通過圖G中各個頂點一次且僅一次的迴路,則稱此迴路為圖的哈密頓迴路;具有哈密頓迴路的圖稱為哈密頓圖。

如果圖G中存在一條通過圖G中各個頂點一次且僅一次的迴路,則稱此迴路為圖的哈密頓迴路;具有哈密頓迴路的圖稱為哈密頓圖。
主要定理:設圖G是哈密頓圖,如果從G中刪去個p頂點得到圖G』,則圖G』的連通分支數小於等於p。

設圖G是具有n個頂點的無向簡單圖,如果G中任意兩個不同頂點的度數之和大於等於n-1,則具有哈密頓通路,即G是半哈密頓圖。

設圖G是具有n個頂點的無向簡單圖,如果G中任意兩個不同頂點的度數之和大於等於n,則G具有哈密頓迴路,即G是哈密頓圖。

㈣ 如何判斷一個圖是否是連著的圖論,演算法

連通圖的特點是圖中任意兩點都是連通的,也就是說只要從任意一點出發能夠到達所有的點就能夠證明是連通圖,否則就是不連通圖
因為不知道你准備採用什麼,具體演算法我就不寫語言了,只是解釋一下原理:
1 採用數組、鏈表或數組,先將所有頂點定義在數組POINT中。
2 採用二維數組,將所有邊(線段)定義在二維數組LINE中,記錄兩遍,邊的兩個頂點分別作為第一項如(v0,v3)(v3,v0)。
3 取出一個頂點v0加入到新數組CONPOINT中,並在頂點數組POINT中刪除。

4 while循環,停止條件是CONPOINT中都標記著已讀
{
從CONPOINT中取出一個有未讀標記的頂點X,並作已讀標記。
從二維數組LINE中查找第一項中包含X的邊,將選出邊的第二個頂點(1個或多個)取出,並加入到新數組CONPOINT中,並作未讀標記(如果已有該點則不作插入)
將選出的邊從二維數組LINE中刪除。
}
比較CONPOINT和POINT數量,如果少了則不是連通圖

㈤ 數學建模第四章 圖論 part4.2最短路徑問題-Dijkstra演算法

1.Dijkstra演算法介紹

演算法特點:

迪科斯徹演算法使用了廣度優先搜索解決賦權有向圖或者無向圖的單源最短路徑問題,演算法最終得到一個最短路徑樹。該演算法常用於路由演算法或者作為其他圖演算法的一個子模塊。

演算法的思路

Dijkstra演算法採用的是一種貪心的策略,聲明一個數組dis來保存源點到各個頂點的最短距離和一個保存已經找到了最短路徑的頂點的集合:T,初始時,原點 s 的路徑權重被賦為 0 (dis[s] = 0)。若對於頂點 s 存在能直接到達的邊(s,m),則把dis[m]設為w(s, m),同時把所有其他(s不能直接到達的)頂點的路徑長度設為無窮大。初始時,集合T只有頂點s。 

然後,從dis數組選擇最小值,則該值就是源點s到該值對應的頂點的最短路徑,並且把該點加入到T中,OK,此時完成一個頂點, 

然後,我們需要看看新加入的頂點是否可以到達其他頂點並且看看通過該頂點到達其他點的路徑長度是否比源點直接到達短,如果是,那麼就替換這些頂點在dis中的值。 

然後,又從dis中找出最小值,重復上述動作,直到T中包含了圖的所有頂點。

2、Dijkstra演算法示例演示

我求下圖,從頂點v1到其他各個頂點的最短路徑.

首先第一步,我們先聲明一個dis數組,該數組初始化的值為:

我們的頂點集T的初始化為:T={v1}

既然是求 v1頂點到其餘各個頂點的最短路程,那就先找一個離 1 號頂點最近的頂點。通過數組 dis 可知當前離v1頂點最近是 v3頂點。當選擇了 2 號頂點後,dis[2](下標從0開始)的值就已經從「估計值」變為了「確定值」,即 v1頂點到 v3頂點的最短路程就是當前 dis[2]值。將V3加入到T中。 

為什麼呢?因為目前離 v1頂點最近的是 v3頂點,並且這個圖所有的邊都是正數,那麼肯定不可能通過第三個頂點中轉,使得 v1頂點到 v3頂點的路程進一步縮短了。因為 v1頂點到其它頂點的路程肯定沒有 v1到 v3頂點短.

OK,既然確定了一個頂點的最短路徑,下面我們就要根據這個新入的頂點V3會有出度,發現以v3 為弧尾的有: < v3,v4 >,那麼我們看看路徑:v1–v3–v4的長度是否比v1–v4短,其實這個已經是很明顯的了,因為dis[3]代表的就是v1–v4的長度為無窮大,而v1–v3–v4的長度為:10+50=60,所以更新dis[3]的值,得到如下結果: 

因此 dis[3]要更新為 60。這個過程有個專業術語叫做「鬆弛」。即 v1頂點到 v4頂點的路程即 dis[3],通過 < v3,v4> 這條邊鬆弛成功。這便是 Dijkstra 演算法的主要思想:通過「邊」來鬆弛v1頂點到其餘各個頂點的路程。

然後,我們又從除dis[2]和dis[0]外的其他值中尋找最小值,發現dis[4]的值最小,通過之前是解釋的原理,可以知道v1到v5的最短距離就是dis[4]的值,然後,我們把v5加入到集合T中,然後,考慮v5的出度是否會影響我們的數組dis的值,v5有兩條出度:< v5,v4>和 < v5,v6>,然後我們發現:v1–v5–v4的長度為:50,而dis[3]的值為60,所以我們要更新dis[3]的值.另外,v1-v5-v6的長度為:90,而dis[5]為100,所以我們需要更新dis[5]的值。更新後的dis數組如下圖: 

然後,我們使用同樣原理,分別確定了v6和v2的最短路徑,最後dis的數組的值如下: 

因此,從圖中,我們可以發現v1-v2的值為:∞,代表沒有路徑從v1到達v2。所以我們得到的最後的結果為:

㈥ 數據結構——圖graph(基礎概念)

【各種東拼西湊來的】

圖(Graph)是由頂點和連接頂點的邊構成的離散結構。在計算機科學中,圖是最靈活的數據結構之一,很多問題都可以使用圖模型進行建模求解。例如:生態環境中不同物種的相互競爭、人與人之間的社交與關系網路、化學上用圖區分結構不同但分子式相同的同分異構體、分析計算機網路的拓撲結構確定兩台計算機是否可以通信、找到兩個城市之間的最短路徑等等。

圖的結構很簡單,就是由頂點$V$集和邊$E$集構成,因此圖可以表示成$G=(V, E)$。

注意: 頂點有時也稱為節點或者交點,邊有時也稱為鏈接。

無向圖

我們可以說這張圖中,有點集$V=\{1, 2, 3, 4, 5, 6\}$,邊集$E=\{(1, 2), (1, 5), (2, 3), (2, 5), (3, 4), (4, 5), (4, 6)\}$。在無向圖中,邊$(u, v)$和邊$(v, u)$是一樣的,因此只要記錄一個就行了。簡而言之,對稱。

有向圖

也很好理解,就是加上了方向性,頂點$(u, v)$之間的關系和頂點$(v,u)$之間的關系不同,後者或許不存在。例如,地圖應用中必須存儲單行道的信息,避免給出錯誤的方向。

加權圖 :

權:與圖的邊或弧相關的數叫做權。

與加權圖對應的就是無權圖,或叫等權圖。如果一張圖不含權重信息,我們就認為邊與邊之間沒有差別。不過,具體建模的時候,很多時候都需要有權重,比如對中國重要城市間道路聯系的建模,總不能認為從北京去上海和從北京去廣州一樣遠(等權)。

還有很多細化的概念,比如:無向圖中,任意兩個頂點間都有邊,稱為 無向完全圖 ;加權圖起一個新名字,叫 網(network) ……然而,如無必要,毋增實體。

鄰接(adjacency) :鄰接是 兩個頂點之間 的一種關系。如果圖包含$(u,v)$,則稱頂點$v$與頂點$u$鄰接。當然,在無向圖中,這也意味著頂點$u$與頂點$v$鄰接。

關聯(incidence) :關聯是 邊和頂點之間 的關系。在有向圖中,邊$(u,v)$從頂點$u$開始關聯到$v$,或者相反,從$v$關聯到$u$。注意,有向圖中,邊不一定是對稱的,有去無回是完全有可能的。細化這個概念,就有了頂點的 入度(in-degree) 和 出度(out-degree) 。無向圖中,頂點的度就是與頂點相關聯的邊的數目,沒有入度和出度。在有向圖中,我們以圖1-2為例,頂點10有2個入度,$3\rightarrow10$,$11\rightarrow10$,但是沒有從10指向其它頂點的邊,因此頂點10的出度為0。

路徑(path) :依次遍歷頂點序列之間的邊所形成的軌跡。注意,依次就意味著有序,先1後2和先2後1不一樣。

簡單路徑 : 沒有重復頂點的路徑稱為簡單路徑。說白了,這一趟路里沒有出現繞了一圈回到同一點的情況,也就是沒有 環 。

環/迴路 :包含相同的頂點兩次或者兩次以上。圖1-3中的頂點序列$<1,2,4,3,1>$,1出現了兩次,當然還有其它的環,比如$<1,4,3,1>$。

簡單迴路/簡單環: 除了第一個頂點和最後一個頂點之外,其餘頂點不重復出現的迴路

無環圖 :沒有環的圖,其中, 有向無環圖 有特殊的名稱,叫做 DAG(Directed Acyline Graph) (最好記住,DAG具有一些很好性質,比如很多動態規劃的問題都可以轉化成DAG中的最長路徑、最短路徑或者路徑計數的問題)。

兩個連通分支:

連通的 :無向圖中每一對不同的頂點之間都有路徑。如果這個條件在有向圖里也成立,那麼就是 強連通 的。

連通分量 :無向圖中的極大連通子圖。

兩點強連通:在有向圖G中,如果兩點互相可達

強連通圖: 如果有向圖G的每兩個頂點都強連通(任意兩點互相可達),稱G是一個 強連通圖 。

強連通分量: 非強連通有向圖的極大強連通子圖,稱為強連通 分量 (strongly connected components)。

關節點(割點) :某些特定的頂點對於保持圖或連通分支的連通性有特殊的重要意義。如果 移除某個頂點 將使圖或者分支 失去連通性 ,則稱該頂點為 關節點 。(在某圖中,若刪除頂點V以及V相關的邊後,圖的一個連通分量分割為兩個或兩個以上的連通分量,則稱頂點V為該圖的一個關節點)。

橋(割邊) :和關節點類似,刪除一條邊,就產生比原圖更多的連通分支的子圖,這條邊就稱為 割邊 或者 橋 。

雙連通圖 :在無向連通圖中,如果刪除該圖的任何一個結點都不能改變該圖的連通性,則該圖為雙連通的無向圖。個人理解就是一個雙連通圖沒有割點,沒有橋的圖。

1.2 一些有趣的圖概念

這一部分屬於圖論的內容,基礎圖演算法不會用到,但是我覺得挺有意思的,小記如下。【這部分我沒看,照搬過來了】

同構 4 :圖看起來結構不一樣,但它是一樣的。假定有$G_1$和$G_2$,那麼你只要確認對於$G_1$中的所有的兩個 相鄰點 $a$和$b$,可以通過某種方式$f$映射到$G_2$,映射後的兩個點$f(a)$、$f(b)$也是相鄰的。換句話說,當兩個簡單圖同構時,兩個圖的頂點之間保持相鄰關系的一一對應。

圖1-7就展示了圖的同構,這里頂點個數很少判斷圖的同構很簡單。我們可以把v1看成u1,自然我們會把u3看出v3。用數學的語言就是$f(u_1)=v_1$,$f(u_3)=v_3$。u1的另外一個連接是到u2,v1的另外一個連接是到v4,不難從相鄰頂點的關系驗證$f(u_2)=v_4$,$f(u_4)=v_2$。

歐拉迴路(Euler Circuit) :小學數學課本上的哥尼斯堡七橋問題,能不能從鎮里的某個位置出發 不重復的經過所有橋(邊)並且返回出發點 。這也就小學的一筆畫問題,歐拉大神解決里這個問題,開創了圖論。結論很簡單:至少2個頂點的連通多重圖存在歐拉迴路的充要條件是 每個頂點的度都是偶數 。證明也很容易,大家有興趣可以閱讀相關資料。結論也很好理解,從某個起點出發,最後要回起點,中間無論路過多少次起點,都會再次離開,進、出的數目必然相等,故一定是偶數。

哈密頓迴路(Hamilton Circuit) :哈密頓迴路條件就比歐拉迴路嚴格一點, 不能重復經過點 。你可能會感到意外,對於歐拉迴路,我們可以輕而易舉地回答,但是 我們卻很難解決哈密頓迴路問題,實際上它是一個NP完全問題 。這個術語源自1857年愛爾蘭數學家威廉·羅萬·哈密頓爵士發明的智力題。哈密頓的智力題用到了木質十二面體(如圖1-8(a)所示,十二面體有12個正五邊形表面)、十二面體每個頂點上的釘子、以及細線。十二面體的20個頂點用世界上的不同城市標記。智力題要求從一個城市開始,沿十二面體的邊旅行,訪問其他19個城市,每個恰好一次,最終回到第一個城市。

因為作者不可能向每位讀者提供帶釘子和細線的木質十二面體,所以考慮了一個 等價的問題 :對圖1-8(b)的圖是否具有恰好經過每個頂點一次的迴路?它就是對原題的解,因為這個平面圖 同構 於十二面體頂點和邊。

著名的 旅行商問題(TSP) 要求旅行商訪問一組城市所應當選取的最短路線。這個問題可以歸結為求完全圖的哈密頓迴路,使這個迴路的邊的權重和盡可能的小。同樣,因為這是個NP完全問題,最直截了當的方法就檢查所有可能的哈密頓迴路,然後選擇權重和最小的。當然這樣效率幾乎難以忍受,時間復雜度高達$O(n!)$。在實際應用中,我們使用的啟發式搜索等 近似演算法 ,可以完全求解城市數量上萬的實例,並且甚至能在誤差1%范圍內估計上百萬個城市的問題。

關於旅行商問題目前的研究進展,可以到 http://www.math.uwaterloo.ca/... 。

1.3 小結

以為可以一帶而過,結果寫了那麼多。也沒什麼好總結的了,當然這些也至是圖論概念的一小部分,還有一些圖可能我們以後也會見到,比如順著圖到網路流,就會涉及二分圖,不過都很好理解,畢竟有圖。

1、數組(鄰接矩陣)

2、鄰接表

3、十字鏈表

4、鄰接多種表

㈦ 經典樹與圖論(最小生成樹、哈夫曼樹、最短路徑問題---Dijkstra演算法)

最小生成樹:在連通網的所有生成樹中,所有邊的代價和最小的生成樹,稱為最小生成樹。

1.Kruskal演算法
此演算法可以稱為「加邊法」,初始最小生成樹邊數為0,每迭代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合里。

Prim演算法
此演算法可以稱為「加點法」,每次迭代選擇代價最小的邊對應的點,加入到最小生成樹中。演算法從某一個頂點s開始,逐漸長大覆蓋整個連通網的所有頂點。

1.圖的所有頂點集合為VV;初始令集合u={s},v=V−uu={s},v=V−u;
2.在兩個集合u,vu,v能夠組成的邊中,選擇一條代價最小的邊(u0,v0)(u0,v0),加入到最小生成樹中,並把v0v0並入到集合u中。
3.重復上述步驟,直到最小生成樹有n-1條邊或者n個頂點為止。

哈夫曼樹又稱最優二叉樹。它是 n 個帶權葉子結點構成的所有二叉樹中,帶權路徑長度 WPL 最小的二叉樹。

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,則哈夫曼樹的構造規則為:
(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個結點);
(2) 在森林中選出兩個根結點的權值最小的樹合並,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;
(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;
(4)重復(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。

注意:為了使得到的哈夫曼樹的結構盡量唯一,通常規定生成的哈夫曼樹中每個結點的左子樹根結點的權小於等於右子樹根結點的權。

在電報通信中,電文是以二進制的0、1序列傳送的,每個字元對應一個二進制編碼,為了縮短電文的總長度,採用不等長編碼方式,構造哈夫曼樹,
將每個字元的出現頻率作為字元結點的權值賦予葉子結點,每個分支結點的左右分支分別用0和1編碼,從樹根結點到每個葉子結點的路徑上
所經分支的0、1編碼序列等於該葉子結點的二進制編碼。如上文所示的哈夫曼編碼如下:

最短路徑問題介紹
問題解釋:
從圖中的某個頂點出發到達另外一個頂點的所經過的邊的權重和最小的一條路徑,稱為最短路徑。

初始狀態:S是已計算出最短路徑的頂點集合,U是未計算除最短路徑的頂點的集合!
第1步:將頂點D加入到S中。
此時,S={D(0)}, U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}。 注:C(3)表示C到起點D的距離是3。

第2步:將頂點C加入到S中。
上一步操作之後,U中頂點C到起點D的距離最短;因此,將C加入到S中,同時更新U中頂點的距離。以頂點F為例,之前F到D的距離為∞;但是將C加入到S之後,F到D的距離為9=(F,C)+(C,D)。
此時,S={D(0),C(3)}, U={A(∞),B(23),E(4),F(9),G(∞)}。

第3步:將頂點E加入到S中。
上一步操作之後,U中頂點E到起點D的距離最短;因此,將E加入到S中,同時更新U中頂點的距離。還是以頂點F為例,之前F到D的距離為9;但是將E加入到S之後,F到D的距離為6=(F,E)+(E,D)。
此時,S={D(0),C(3),E(4)}, U={A(∞),B(23),F(6),G(12)}。

第4步:將頂點F加入到S中。
此時,S={D(0),C(3),E(4),F(6)}, U={A(22),B(13),G(12)}。

第5步:將頂點G加入到S中。
此時,S={D(0),C(3),E(4),F(6),G(12)}, U={A(22),B(13)}。

第6步:將頂點B加入到S中。
此時,S={D(0),C(3),E(4),F(6),G(12),B(13)}, U={A(22)}。

第7步:將頂點A加入到S中。
此時,S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)}。

此時,起點D到各個頂點的最短距離就計算出來了:A(22) B(13) C(3) D(0) E(4) F(6) G(12)。

㈧ 機器學習演算法和圖論演算法有什麼不同

機器學習演算法和圖論演算法有什麼不同
或者,演算法是怎麼分類的?首先想到的,處理的數據量上的不同。比如傳統的一個道路規劃問題,涉及到的對象在百數量級上是很正常的現象,而現在數據產生的速度太快了,數據太多了,對於一個網路優化問題可能涉及的對象是幾個億,比如facebook。但是這還是不能回答我最開始的問題,即便是百萬,十萬對象的網路,比如約會網站吧,在這個數量級差不多,它會涉及到推薦演算法,推薦的方法的話是用概率模型去做的,可以用機器學習的方法學習出一些結果;那麼對一個同量級的對象,會需要一個圖論演算法去做解決什麼問題嗎?個人覺得機器學習主要在於解決問題的思路不同,態度更開放,我曉得的一些圖論演算法就是針對一個對於全局有了很穩定認識的解決方法,而比如一個線上的機器學習演算法,它的預測結果直接影響新數據的產生。基本上這樣的方法是可靠的,對於任意一個全局的演算法,可以用開放的眼光看它,即用機器學習的方法適用它將它應用到新的有大量數據支持的適宜的問題中的。

這個時代的困難在於,我們不能用自己大腦在一瞬間可以理解的范圍之內全面的理解一個問題,我們把大家的大腦都連起來了,我們也需要更強大的工具理解前所未有的問題。比如,從遠古,理解若干個事件交織的復雜的問題是有困難的,我們利用文氏圖清晰地顯示多於4、5個事件之間的邏輯關聯。現在是幾十億人,不知多少事件的關聯,利用文氏圖都不夠了,但是我們總是可以找到合適的切入點提綱契領的理解總體的事物,我們的工具變成了高等數學,可靠的矩陣運算。所以,我自己傾向於將機器學習看成可靠地幫助我們理解新事物的方法,它使用的工具來自我們可靠的數學觀點。

所以,機器學習的想法最重要,可以從任何一種現有的可靠的觀點指導下,拓展我們理解世界的方式。我想把它解釋為一種群體智慧的形成機制,為什麼是群體智慧,我做為個人不需要識別一萬張臉與他們的名字對應,但是做為一個公司卻有需要在一秒鍾之內認出自己的客戶並且向他問好,提供服務。也就是說,我們生活的時代群體智慧起不可估量的作用,向四周一看你就明白你所用物品大部分不是來自認識和親近的人。其實也是觀念的成長,中國很長一段時間的小農經濟自給自足,如果你吃的竟然是別人種的糧食,穿是別人織布剪裁,這在當時會是讓你很不適應的。這個如今排斥Google的街景車來保衛自己的隱私這有啥差別呢?再到離我們更近一點的歷史,更多的是群體智慧具象化的產品的傳播,而如今呢更直接的就是群體智慧的傳播。
機器學習背後的Philosophy應該是這樣一種開放的面向未來的態度,我自己挺認同,也希望能把群體智慧開掘出來,產生前所未有商業價值。

㈨ 運籌學中的圖論問題

很多實際的生產問題都能被抽象成一張大的圖。具體一點的例子,比如需要在若干個城市之間鋪設鐵路或者架設電網,那麼城市就是圖裡面的點,鐵路電網就是圖裡面的邊。抽象一點的例子,比如完成一個項目的過程中所有可能出現的狀態都可以視為一個點,而狀態到狀態之間的轉換就是邊。上一篇文章中我們說過運籌學是處理實際生產生活中遇到的問題的。一旦實際問題被抽象成了一個圖的模型(注意與機器學習裡面的圖模型區分開來),很多圖論裡面的演算法就可以用來解決實際問題,所以圖論是運籌學當中的一個很大的分支。今天我們就介紹一下幾個圖論的基本演算法及其在生產生活中的應用。

一最小生成樹

比如現在要在若干個村子之間架設電網,保證每個城市都通上電(先不考慮電網輸電能力大小)。雖然理論上講,任何兩個村子之間都可以架設電線,不過那樣的話成本很到,不劃算,我們需要在所有可能的連線裡面找到一組總長最短的邊,保證這些邊把每個村子都連上了。在圖論中,這是一個典型的最小生成樹問題。有兩種解決最小生成樹的方法,第一種辦法是把所有的邊按照從小到大的順序添加到圖裡面,如果產生迴路就舍棄它,直到覆蓋了所有的點。另一種方法是把圖上的邊按照從大到小的順序刪除,直到再刪下去就一定會產生離散的點為止。

二最短路徑

圖論中應用最廣的問題可能就是最短路徑問題了。地圖上很多城市之間都有道路相連,想從一個城市到另一個城市,往往有多種選擇,可是走那條路距離最短呢?如果地圖規模不大,我們可以一眼就看出來。可是隨著地圖規模變大,就很難再一眼看出來了,需要有嚴格的演算法保證找到最短路徑。目前已經有了很多種最短路徑演算法,他們的基本思想也不盡相同。以著名的Dijkstra演算法為例,它每次會選擇距離「所有已經選擇過了的點」中距離最近的下一個點,一步步的迭代下去。這個流程保證了演算法會按照距離出發點由近到遠的順序選擇每一個點。

三最大流-最小割問題

油氣輸送網路又許多不同的邊組成,每一條邊的運輸能力有限。輸送油氣資源的時候,為了最大化運輸量,需要合理安排通過每一條邊的油氣流量。這就是在一個網路尋找最大流的問題(等價於尋找最小割)。解決問題的想法很簡單,找到一組邊,它們把整個網路分成了兩部分,流的源和目的地址分屬於這兩個部分。我們稱這樣一組邊為圖的一個分割。由於所有的油氣流都要通過分割中的邊,所以最大流其實受制於分割的流通能力的。於是最大流應該等於流通能力最小的分割。剩下的問題,就是一步步調整,找到最小分割了。

閱讀全文

與圖演算法與圖論相關的資料

熱點內容
加密門禁卡寫入成功無法開門 瀏覽:447
齒輪傳動pdf 瀏覽:35
alpinelinux 瀏覽:148
手機端app的掃碼功能在哪裡 瀏覽:225
少兒編程中小班英語教案 瀏覽:450
鎖屏密碼加密手機怎麼解除 瀏覽:203
linuxlostfound 瀏覽:132
征途伺服器ip地址 瀏覽:328
git提交代碼命令行 瀏覽:163
什麼叫瀏覽器伺服器結構 瀏覽:155
於謙聊天哪個app 瀏覽:447
小鵬汽車nlp演算法工程師薪資 瀏覽:879
代碼加密與隱藏 瀏覽:647
fordfulkerson演算法 瀏覽:350
京東熱app在哪裡可以下載 瀏覽:874
彩報圖書app哪個好 瀏覽:301
新君威20壓縮比 瀏覽:186
手機php整站 瀏覽:915
windows路由跳轉命令 瀏覽:472
量子遺傳演算法程序 瀏覽:222