數據結構 圖


圖是一種比線性表和樹更復雜的數據結構,
在圖中,結點之間的關系是任意的,任意兩個數據元素之間都可能相關。圖是一種多對多的數據結構。

概述

概念:

圖(Graph):
由頂點的有窮非空集合和頂點之間邊的集合組成。
通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。

注意:線性表和樹中可以沒有元素;而在圖中可以沒有邊,但是不允許沒有頂點,。

網:
帶有權重的圖

環:
第一個頂點和最后一個頂點相同的路徑;

基本術語:

無向邊:
若頂點Vi和Vj之間的邊沒有方向,稱這條邊為無向邊(Edge),用(Vi,Vj)來表示。

有向邊/弧(Arc):
若從頂點Vi到Vj的邊有方向,稱這條邊為有向邊。
用<Vi, Vj>來表示,其中Vi稱為弧尾(Tail),Vj稱為弧頭(Head)。

權(Weight):
表示從圖中一個頂點到另一個頂點的距離。

度:
與頂點相連接的邊數;

出度、入度:
有向圖中的概念,出度表示以此頂點為起點的邊的數目,入度表示以此頂點為終點的邊的數目;

圖的分類:

按邊的類型分類:

  • 無向圖(Undirected graphs): 圖中任意兩個頂點的邊都是無向邊。

  • 有向圖(Directed graphs): 圖中任意兩個頂點的邊都是有向邊。

按邊的數量分類:

稀疏圖與稠密圖:
有很少條邊或弧的圖稱為稀疏圖,反之稱為稠密圖。

按有無環分類:

  • 簡單圖: 不存在自環(頂點到其自身的邊)和重邊(完全相同的邊)的圖
  • 簡單環: 除去第一個頂點和最后一個頂點后沒有重復頂點的環;

其他圖的分類:

  • 無向完全圖: 無向圖中,任意兩個頂點之間都存在邊。

  • 有向完全圖:有向圖中,任意兩個頂點之間都存在方向相反的兩條弧。

  • 連通圖:任意兩個頂點都相互連通的圖;

極大連通子圖:
包含竟可能多的頂點(必須是連通的),即找不到另外一個頂點,使得此頂點能夠連接到此極大連通子圖的任意一個頂點;

連通分量:
極大連通子圖的數量;

強連通圖:
此為有向圖的概念,表示任意兩個頂點a,b,使得a能夠連接到b,b也能連接到a 的圖;

儲存結構

常用的有:鄰接表和鄰接矩陣,十字鏈表

遍歷方式

圖的遍歷通常有兩種方法:深度優先遍歷和廣度優先遍歷。

最小生成樹(ST)

最短路徑

概念:

最短路徑:
網中,最短路徑是指兩個頂點之間經過的邊上權值之和最少的路徑。
與最小生成樹不同,路徑上不一定有n個結點,也不一定包含n-1條邊
源點:
路徑上的第一個頂點。
終點:
路徑上的最后一個頂點。

計算最短路徑算法:
迪傑斯特拉(Djikstra)算法:單源最短路
佛洛伊德(Floyd)算法: 所有頂點間的最短路徑

Djikstra算法

注意:我們不考慮負值圈(邊的權值為負數)
迪傑斯特拉算法
作用:
求出單源點最短路徑。
也就是能求出任意兩個頂點之間的最短路徑。(如果有)
思想:

  • 初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即:U={其余頂點},若v與U中頂點u有邊,則<u,v>正常有權值,若u不是v的出邊鄰接點,則<u,v>權值為∞。
  • 從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。
  • 以k為新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改后的距離值的頂點k的距離加上邊上的權。
  • 重復步驟b和c直到所有頂點都包含在S中。

Floyd算法

佛洛伊德算法
作用:
所有頂點間的最短路徑;
也就說運行一般算法后,任意兩個頂點的最短路便就直到了。
思想:
我們知道:從任意節點A到任意節點B的最短路徑只有兩種情況:

  • 1是直接從A到B
  • 2是從A經過若干個節點到B。
    所以我們只需要將所有情況的中間路徑遍歷一邊,取
    dist[i][j] =min( dist[i][j] ,dist[i][k] + dist[k][j] );即可。

拓撲排序

概述

拓撲序列
在AOV網中,若不存在回路,(有向無環圖)
則所有活動可排列成一個線性序列,
使得每個活動的所有前驅活動都排在該活動的前面,我們把此序列叫做拓撲序列。

思想:

  1. 預處理得到每個點的入度
  2. 執行入度為 0 的點(沒有前驅),放入一個待執行的容器,在圖中刪除,
  3. 刪除在圖中以他為弧尾的弧刪除。
  4. 重復上面兩步,直到所有頂點均輸出/途中不存在無前驅的頂點。
  • 如果排序后,還剩下部分點,說明圖中有環
  • 所有頂點均輸出,則圖中無環。

關鍵路徑

概述:

AOE網(Activity On Edge Network)
把工程計划表示為邊表示活動的網。
用頂點表示事件,弧表示活動,弧的權表示活動的持續時間。
常用來估算工程的時間。
事件:
表示在它之前的活動已經完成,在它之后的活動可以開始。

路徑長度:
路徑上各個活動所持續的事件之和。

關鍵路徑:
從源點到終點具有最大長度的路徑。
關鍵路徑可能不止一條
關鍵活動:
在關鍵路徑上的活動。
Ve(j):是指從始點開始到頂點Vj的最大路徑長度
Vl(j):在不推遲整個工期的前提下,事件vj允許的最晚發生時間
e(i): 若活動ai由弧<vk,vj>表示,則活動ai的最早開始時間應該等於事件vk的最早發生時間。因而,有:e(i)=ve(k);(即:邊(活動)的最早開始時間等於,它的發出頂點的最早發生時間)

思想:

  • 先根據首結點的Ve(j)=0由前向后計算各頂點的最早發生時間
  • 再根據終結點的Vl(j)等於它的Ve(j)由后向前依次求解各頂點的最晚發生時間
  • 根據邊的e(i)等於它的發出頂點的Ve(j)計算各邊的最早開始時間(最早開始,對應最早發生)
  • 根據邊的l(i)等於它的到達頂點的Vl(j)減去邊的權值計算各邊的最晚開始時間(最晚開始,對應最晚發生)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM