無向圖算法
1.圖是由結點和這些結點之間的鏈接所構成,結點叫作頂點,結點之間的鏈接是邊,樹是圖的一種。數組
2.無序圖是一種邊爲無序結點對的圖,若是圖中的兩個頂點之間有一條連通邊,則稱爲這兩個頂點是鄰接的,鄰接頂點有時也稱爲鄰居,連通一個頂點及其自身的邊稱爲自循環或環。網絡
3.路徑是圖中的一系列邊,路徑的長度是該路徑中邊的條數(或頂點數減1)。數據結構
4.若一個無向圖含有最多條邊,那麼它爲徹底圖。對於有n個頂點的無向圖,第x個頂點,須要(n-x)條邊將其與其餘頂點聯通,有n(n-1)/2條邊。學習
5.若無向圖中任意兩個頂點之間都存在一條路徑,那麼認爲這個無向圖是連通的。測試
1.有向圖也稱爲雙向圖,它是一種邊爲有序頂點對的圖,有向圖中的路徑是圖中連通兩個頂點的有向邊序列。字體
2.若是有向圖中沒有環路,且有一條從A到B的邊,則能夠把頂點A安排在頂點B以前,這種排列獲得的頂點次序稱爲拓撲序。spa
3.可使用某一隊列列表(其中每一隊列都表示了給定優先級的項目)來實現一個優先級隊列.net
4.按照優先級對堆排序完成了第一次排序(高優先級的項目在先)。可是,咱們必須對具備相同優先級項目的先進先出排序進行操縱:
解決方案是建立一個 PriorityQueueNode對象,它存儲的是將被放置在隊列中的元素,該元素的優先級,以及元素放進隊列的順序
而後,咱們只需爲 PriorityNode類定義個 compareTo方法,以便先對優先級進行比較,而後在優先級同樣的時候再對階進行比較指針
1.網絡或稱加權圖,是一種每條邊都帶有權重或代價的圖,加權圖中的路徑權重是該路徑中各條邊權重的和。
2.對於網絡,咱們將用一個三元組來表示每條邊,這個三元組中包括起始頂點、終止頂點和權重。
3.對於無向網絡來講,起始頂點與終止頂點能夠互換。
1.廣度優先遍歷(隊列實現):首先,從圖的某個頂點v0出發,訪問了v0以後,依次訪問與v0相鄰的未被訪問的頂點,而後分別從這些頂點出發,廣度優先遍歷,直至全部的頂點都被訪問完。
- (1)從一個未走到過的頂點做爲起始頂點,好比元素0頂點做爲起點。
- (2)沿0頂點的邊去嘗試訪問其它未走到過的頂點,首先發現2頂點尚未走到過,因而來到了2頂點。
- (3)返回到0頂點,再以0頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,這樣來到了1頂點。
- (4)返回到0頂點,再以0頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,這樣來到了5頂點。
- (5)此時沿0頂點的邊,已經不能訪問到其它未走到過的頂點了,因此須要返回到2頂點。
- (6)沿2頂點的邊去嘗試訪問其它未走到過的頂點,(由於1頂點已經走過了)首先發現3頂點尚未走到過,因而來到了3頂點。
- (7)返回到2頂點,再以2頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,這樣來到了4頂點。
- (8)此時沿4頂點的邊,已經不能訪問到其它未走到過的頂點了,至此,全部頂點咱們都走到過了,遍歷結束。
2.深度優先遍歷(棧實現):首先從圖中某個頂點v0出發,訪問此頂點,而後依次從v相鄰的頂點出發深度優先遍歷,直至圖中全部與v路徑相通的頂點都被訪問了;若此時尚有頂點未被訪問,則從中選一個頂點做爲起始點,重複上述過程,直到全部的頂點都被訪問。在訪問某一個頂點時:將它標爲已訪問,遞歸的訪問它的全部未被標記過的鄰接點
- (1)首先從一個未走到過的頂點做爲起始頂點,好比元素0頂點做爲起點。
- (2)沿0頂點的邊去嘗試訪問其它未走到過的頂點,首先發現2頂點尚未走到過,因而來到了2頂點。
- (3)再以2頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,這樣又來到了1頂點。
- (4)再以1號頂點做爲出發點繼續嘗試訪問其它未走到過的頂點。
- (5)此時沿1頂點的邊,已經不能訪問到其它未走到過的頂點了,因此須要返回到2頂點。
- (6)返回到2號頂點後,以2頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,此時又會來到3頂點,再以3號頂點做爲出發點繼續訪問其它未走到過的頂點,因而又來到了5號頂點。
- (7)此時沿5頂點的邊,已經不能訪問到其它未走到過的頂點了,因此須要返回到3頂點。
- (8)返回到3頂點後,以3頂點做爲出發點繼續嘗試訪問其它未走到過的頂點,此時會來到4頂點,再以4頂點做爲出發點繼續訪問其它未走到過的頂點。
- (9)此時沿4頂點的邊,已經不能訪問到其它未走到過的頂點了,至此,全部頂點咱們都走到過了,遍歷結束。
1.測試連通性:在一個圖中,不管哪一個爲起始頂點,當且僅當廣度優先遍歷中的頂點數等於圖中的頂點數目時,則該圖是連通的。
2.最小生成樹:
- 生成樹是一棵含有圖中全部頂點和部分邊(可能不是全部邊)的樹。
- 最小生成樹是邊的權重總和和小於或等於同一個圖中其餘任何一棵生成樹的權重總和。
- 非連通的無向圖,不存在最小生成樹
- 權重不必定和距離成正比
- 權重多是0或負數
- 若存在相等的權重,那麼最小生成樹可能不惟一
3.判斷最短路徑:
- 方法一:斷定起始頂點與目標頂點之間的字面意義上的最短路徑,即兩個頂點之間的最小邊數。
- 方法二:在加權圖途中,尋找加權圖的最便宜路徑即爲最短路徑。
1.鄰接列表
- 在鄰接表的表示中,無向圖的同一條邊在鄰接表中存儲的兩次。若是想要知道頂點的讀,只須要求出所對應鏈表的結點個數便可。
- 有向圖中每條邊在鄰接表中只出現一此,求頂點的出度只須要遍歷所對應鏈表便可。求出度則須要遍歷其餘頂點的鏈表。
2.鄰接矩陣:
- 在鄰接矩陣表示中,無向圖的鄰接矩陣是對稱的。矩陣中第 i 行或 第 i 列有效元素個數之和就是頂點的度。
- 在有向圖中 第 i 行有效元素個數之和是頂點的出度,第 i 列有效元素個數之和是頂點的入度。
3.鄰接矩陣與鄰接表優缺點:
- 鄰接矩陣的優勢是能夠快速判斷兩個頂點之間是否存在邊,能夠快速添加邊或者刪除邊。而其缺點是若是頂點之間的邊比較少,會比較浪費空間。由於是一個 n∗nn∗n 的矩陣。而鄰接表的優勢是節省空間,只存儲實際存在的邊。其缺點是關注頂點的度時,就可能須要遍歷一個鏈表。還有一個缺點是,對於無向圖,若是須要刪除一條邊,就須要在兩個鏈表上查找並刪除。
4.邊集數組:
- 邊集數組由兩個一維數組構成:一個存儲頂點信息; 一個存儲邊的信息,這個邊數組每一個數據元素由一條邊的起點下標、終點下標、和權組成。
- 邊集數組關注的是邊的集合,在邊集數組中要查找一個頂點的度須要掃描整個邊數組,效率並不高。所以它更適合對邊依次進行處理的操做,而不適合對頂點相關的操做。
5.十字鏈表:
- 十字鏈表是爲了便於求得圖中頂點的度(出度和入度)而提出來的。用十字鏈表來存儲有向圖,能夠達到高效的存取效果。它是綜合鄰接表和逆鄰接表形式的一種鏈式存儲結構。
6.鄰接多重表:
- 鄰接多重表主要用於存儲無向圖。若是用鄰接表存儲無向圖,每條邊的兩個邊結點分別在以該邊所依附的兩個頂點爲頭結點的鏈表中,這給圖的某些操做帶來不便。所以,在進行這一類操做的無向圖的問題中採用鄰接多重表做存儲結構更爲適宜。
問題1:無