5.4圖的應用

圖的應用

1.最小生成樹(研究問題:N個村莊修路連通,怎樣花銷最小讓N個村莊連通)

一個連通圖的生成樹是該圖的極小連通子圖,通常爲帶權無向圖

包含所有頂點,儘量少的邊。

刪除一條邊則變爲非連通圖,增加一條邊則會產生迴路。

特點:

1.最小生成樹不唯一,但該無向連通圖中無相同權值邊則最小生成樹唯一;

2.最小生成樹的權值之和唯一,即代價唯一;

3.該樹頂點數爲該連通圖結點個數n,所有該生成樹邊爲n-1。

常用生成樹算法:

1.prim算法

2.Kruskal克魯斯卡爾算法

兩種算法都屬於貪心算法。這也說明了生成樹不唯一。

注:帶權連通圖的任一一個環中所包含的權值均不相同(充分不必要條件),則最小生成樹唯一;

1.1prim算法

1.初始結點並加入頂點集U中;

2.遍歷頂點集U中頂點,取指到向下一頂點的權值最小邊且不造成迴路,並將該下一頂點加入頂點集;

3.循環2直到所有頂點加入頂點集。

//V爲結點集合
void Prim(G,T){
    T=null;
    U={v1};
    while(U!=V){
        edge,next_v =find_min_nextnode(U,V-U);//找到U中頂點到V-U中頂點最小邊
        T+=edge;//該邊加入最小生成樹
        U+=next_v;//對應結點加入U集合
    }
}
//時間複雜度O(V^2),不依賴E

[外鏈圖片轉存失敗(img-I4qbXAVm-1568732822107)(F:\Tim\1094201572\MobileFile\IMG_20190905_223948__01.jpg)]

1.2Kruskal算法

1.初始化所有邊爲堆

2.堆查找最小權值邊,且不構成迴路;並在堆集合刪除該邊;故選擇最小權值邊時間複雜度爲O(logE)

3.循環2直至連通分量數爲0,也就是T中邊樹爲n-1;

//按權值遞增的次序選擇小而合適的邊構造最小生成樹
void Kruskal(G.V,T){
    T = V;
    numS = n;//連通分量數
    while(numS > 1){
        min_e = find_min_E(E);
        if(該邊在剩餘堆集合中會構成迴路){
            T+=min_e;
            numS--;
        }
    }
}

[外鏈圖片轉存失敗(img-aCDU36QM-1568732822109)(F:\Tim\1094201572\MobileFile\IMG_20190905_224034__01.jpg)]

1.3破圈法

2.最短路徑(a村莊到b村莊所花最小開銷到達的路徑)

最短路徑一定爲簡單路徑,即路徑中結點不重複。

對於無權圖而言,兩點之間邊數最少的路徑爲最短路徑;可用廣度優先搜索查找最短路徑;

對於有權圖(可有向可無向),兩點之間帶權路徑最短的爲最短路徑;

求解有權圖最短路徑的算法:

Dijkstra迪傑斯拉算法:求帶權有向圖的指定某一頂點到其他個個頂點的的最短路徑,即求單源最短路徑;

Floyd弗洛伊德算法:求帶權有鄉土所有頂點的之間的最短路徑;

2.1Dijkstra算法

求某一頂點到其他個個頂點的的最短路徑,即求單源最短路徑;算法基於貪心策略,主體部分爲一個雙重循環,時間複雜度爲O(V^2),

若要使用Dijkstra求解所有頂點之間的最短路徑則指定V每一結點各使用一便Dijkstra算法。時間複雜度爲O(V^3),故dijkstra認爲可以求解每對頂點之間的最短路徑問題

注:Dijkstra不適用帶負權值的圖

算法思想:

集合S,先後順序存放求得最短路徑的結點

1)初始化:S={0},0爲V0源點結點,dist[i] =G.arcs[0]i],i=1,2,… //V0到Vi結點的當前最短距離,限制爲1步;

2)從V-S中選出結點Vj,Vj=Min{dist[i]|Vi屬於V-S中},選取當前限制步速到達結點中距離最短的結點加入S集合中,S=S+{j},即該輪得到最短路徑的結點

3)限制步速+1,更新使V0結點限制步速到達任一結點的最短路徑,dist[j]+G.arcs[j]k]<dist[k].則更新dist

4)重複2)3)操作n-1輪,直到所有結點包含在S中

注:Dijkstra求最短路徑的“權值最小”和prim求最小生成樹的“權值最小”的區別

Prim求最小生成樹的“權值最小”是U集合中點到V-U集合中點的最小權值邊;

最小生成樹問題的圖爲帶全無向圖。 ·

而Dijkstra求最短路徑的“權值最小”是源點到結點的的路徑權值最小,即始終相對於選取的原點V0限制步速到指定結點的路徑之和權值最小。

最短路徑問題的圖可爲無向也可爲有向。

最短路徑例題:

[外鏈圖片轉存失敗(img-gUxRCug5-1568732822110)(F:\Tim\1094201572\MobileFile\Dijkstra_example.jpg)]

Dijkstra算法過程:

[外鏈圖片轉存失敗(img-hHTE9NDI-1568732822111)(F:\Tim\1094201572\MobileFile\Dijkstra_example2.jpg)]

依次求出1到5,4,2,3的最短路徑

1-5:5;

1-5-4:7;

1-5-2:8;

1-5-2-3:9;

2.2Floyd算法

算法描述:

定義個n階方陣序列A(-1),A(0),…,A(n-1),其中A(-1)爲初始圖 的鄰接矩陣arcs[i]-[j];

A(k)[i]-[j] = Min{A(k-1)[i]-[j],A(k-1)[i]-[k]+A(k-1)[k]-[j] }

時間複雜度爲O(V^3).

Floyd允許圖中帶負權值的邊,但不允許負權值邊構成迴路。而Dijkstra不適用帶負權值的圖。

[外鏈圖片轉存失敗(img-VTf7jDAX-1568732822124)(F:\Tim\1094201572\MobileFile\floyd.jpg)]

3.拓撲排序(

求解AOV網問題,有向無環圖DAG圖,頂點表示活動,邊表示活動與活動之間存在聯繫;

金典研究問題:學生專業選課,頂點爲課程,邊爲課程之間的關係,先修什麼再修什麼,拓撲排序給出結果,

即需要先完成什麼才能繼續幹什麼;

算法思想:

1.從有向無環圖中選擇一個沒有前驅的頂點-即該頂點入度爲0的頂點-輸出;

2.從圖中刪除該頂點和所有以它爲起點的有向邊;

3.重複1,2直到該有向無環圖爲空或當前不存在無前驅的頂點爲止,後者情況說明該有向圖存在環,拓撲排序失敗。

bool TopoSort(Graph G){

​ InitStatck(S); //使用存放入度爲0的頂點,也可使用隊列,不一定要使用棧;

​ V v = find_indegree_equ_zero(G);

​ Push(S,v);

​ while(!IsEmpty(S)){ //O(V+E) ,V爲遍歷的頂點,E爲每個頂點所需刪除的邊即需修改下一頂點的入度次數

​ Pop(S,temp_v);

​ print(temp_v);count++; //輸出該結點並計數;

​ reduce_nextv_indegree(temp_v,1);//下一節點

​ V v = find_indegree_equ_zero(G);

​ Push(S,v);

​ }

​ if(count < sum(G.V)) return false; //拓撲排序失敗,圖中存在迴路;

​ else return true;//拓撲排序成功,該圖爲AOV網;

}

算法時間複雜度度爲O(V+E);

工程問題中:

1)入度爲0的頂點爲,這個工程開始活動或繼續活動,即該活動沒有前驅活動或該活動的前驅活動已完成;

2)若活動線性有向排列,則拓撲排序唯一;例 1->2->3,拓撲排序123 注:活動線性有向排列 是 拓撲排序唯一 的充分不必要條件

3)若一個有向圖具有有序拓撲排序序列,則它的鄰接矩陣必定爲三角矩陣;(按照拓撲排序的結果重新安排頂點的序號,生成的新的鄰接矩陣爲三角矩陣;)

一般的圖,其鄰接矩陣爲三角矩陣**(充分不必要條件)**,則存在拓撲排序;反之不然;

4.關鍵路徑(

求解AOE網問題,帶權有向圖,頂點表示事件,邊表示活動;

解決問題:

1)完成整個項目工程至少需要多少時間(關鍵路徑)?

2)爲縮短完成工程的時間,應加快哪些活動(AOE中的邊)? 或者說哪些活動是影響工程的關鍵?

完成整個工程所需的時間取決於從源點到匯點的最長路徑長度,即在這條路徑上所有活動的花費之和。這條路徑長度最長的路徑就叫做關鍵路徑(Critical Path)。

關鍵路徑上的花費即完成該工程項目至少需要的時間,即整個項目的完成時間(時間最長),即最早完成時間(書上說法);

1.事件的最早發生時間(到達該事件至少需要多少時間,即到達該事件最久時間)

V源=0;

Ve(k)=Max{Ve(j)+w(Vj,Vk)} 注:計算Ve(k)按從順序計算

2.事件的最遲發生時間(最遲發生+與下一事件活動時間爲下一事件的最早發生時間)

Vl(匯點)=Ve(匯點);

Vl(j)=Min{Vl(k)-w(Vj,Vk)} 注:計算Vl(j)按從順序計算

3.活動的最早開始時間

活動的起點表示的事件的最早發生時間e(i)=Ve(k);

4.活動的最遲開始時間

活動終點所表示的事件的最遲發生時間與該活動之差l(i)=Vl(j)-w(Vk,Vj),<Vk,Vj>表示活動ai;

5.活動完成的時間餘量

d(i)=l(i)-e(i); 若一個活動的時間餘量爲0,則說明該活動ai爲關鍵活動,不如期完成會影響整個工程的進度;

注:

1)構造關鍵路徑需要拓撲排序

2)關鍵活動的最早開始時間與最晚開始時間相等

具體實例:

[外鏈圖片轉存失敗(img-3v1S9xpY-1568732822125)(F:\Tim\1094201572\MobileFile\關鍵路徑.jpg)]

關鍵路徑(v1,v3,v4,v6) 關鍵路徑上的活動有a2,a5,a7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章