圖的連通性問題之Prim算法和克魯斯卡爾(Kruskal)算法

前言

這是我聽老師講課做的筆記,考試要看的。
作者:RodmaChen
關注我的csdn博客,更多數據結構與算法知識還在更新

一.概念

生成樹(必考):圖的極小連通子圖。即:對於有n個頂點的無向連通圖,無論其生成樹的形態如何,所有生成樹中都有且僅有
n-1條邊。

如果在一棵生成樹上添加一條邊,必定構成一個環。

如果一個圖有N個頂點和小於N-1條邊,則是非連通圖

N-1條邊的圖不一定是生成樹。

最小生成樹(Minimum Spanning Tree) :如果無向連通圖是一個,那麼,它的所有生成樹中必有一棵邊的權值總和最小的生成樹。

二.求最小生成樹的兩個算法

必考考兩個算法(5分)

  1. Prim算法

(1)介紹

假設G=(V,E)爲一網圖,其中V爲網圖中所有頂點的集合E爲網圖
中所有帶權邊的集合。設置兩個新的集合U和T,其中集合U用於存放G 的最小生成樹中的頂點,集合T存放G的最小生成樹中的。令集合U的初值爲U={u1}(假設構造最小生成樹時,從頂點u1出發),集合T的初值爲T={}

Prim算法的思想是:從所有u∈U,v∈V-U的邊中,選取具有最小權值
的邊(u,v),將頂點v加入集合U中,將邊(u,v)加入集合T中,如
此不斷重複,直到U=V時,最小生成樹構造完畢,這時集合T中包含了
最小生成樹的所有邊。

(2)代碼實現


void Prim( MGraph G, VertexType u) {
//用普里姆算法從第u個頂點出發構造網G的最小生成樹T,輸出T的各條邊。
//記錄從頂點集U到V-U的代價最小的邊的輔助數組定義:
/ struct {
// VertexType adivex;
// VRType lowcost;
// }closedge[ MAX_VERTEX_NUM];
//(1) 求初始頂點下標k
i=0;
while(G.vex[i]!=u)
i++;
k=i;
//(2)初始化closedge數組
for(i=0;i<G.n;i++)
{
closedge[i].adivex=u;
closedge[i].lowcost=G.edges[k][i];
}
closedge[k]. lowcost = 0; //初始,U={u}
//(3)找剩餘的頂點
for(i=1;i<G.n;i++)
{
k=minimum(closedge) ;
printf(closedge[k].adjvex;G.vex[k])
closedge[k]. lowcost=0;
for (j=0; j<G. vexnum; j++)
if (G. edgs[k][j] < closedge[j]. lowcost)
{
closedge[j].lowcost = G. edgs[k][j];
closedge[j].adjvex= G. vex[k];
}
}
}
  1. 克魯斯卡爾(Kruskal)

算法思想(找出最小權值連接)

(1) 首先構造一個只有n個頂點但沒有邊的非連通圖T={V, ∅ },圖中每個頂點自成一個連通分量。

(2)當在邊集 E 中選到一條具有最小權值的邊時,若該邊的兩個頂點落在T中不同的連通分量上,則將此邊加入到生成樹的邊集合T 中;否則將此邊捨去,重新選擇一條權 值最小的邊。
(3)如此重複下去,直到所有頂點在同一個連通分量上爲止。 此時的T即爲所求。

三.有向無環圖(DAG圖)

在這裏插入圖片描述
一個無環的有向圖稱做有向無環圖(directed acycline graph),簡稱DAG圖

應用:拓撲排序

1.拓撲排序的定義

拓撲排序是將有向圖的頂點排成一個線性序列的過程,它滿足:

  • 若i到j有一條路徑,i是j前驅,j是i的後繼.
  • 若<i,j>是一條弧,則i是j直接前驅,j是i的直接後繼。

頂點表示活動,用表示活動間的優先關係的有向無環圖,稱爲 頂點表示活動的網(Activity On Vertex
Network),簡稱爲 AOV- 網。

(2)拓撲排序的方法(Topological Sort)

在有向圖中選一個沒有前驅的頂點,且輸出之;

從有向圖中刪除該頂點和以它爲尾的所有弧;

重複以上兩步,直至所有頂點被輸出,或有向圖中沒有無前驅的結點

(1)採用鄰接表作有向圖的存儲結構,且在頭結點中增加一個存放頂點入度的數組。

(2)入度爲0的頂點即爲沒有前驅的結點,刪去頂點及以它爲尾的弧的操作,可換成弧頭頂點的入度減1的操作。

(3)爲避免重複檢測入度爲0的頂點,另設一棧暫存所有入度爲0的頂點。

在這裏插入圖片描述

要考

路徑長度最長的路徑叫做 關鍵路徑

四.邊學邊練

  1. 如下圖所示的一個網圖,按照Prim方法,從頂點v1出發,畫出
    該網的最小生成樹。

本人博客:https://blog.csdn.net/weixin_46654114
本人b站求關注:https://space.bilibili.com/391105864
轉載說明:跟我說明,務必註明來源,附帶本人博客連接。

請給我點個贊鼓勵我吧
在這裏插入圖片描述

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