定義
接下來以題為例,分別介紹prim和kruskal演算法
關於輸入輸出的要求:
輸入乙個n表示總共的村莊數
接下來輸入乙個n*n的矩陣表示鋪設**線的路徑
(第一行的n個數分別表示a與b,c,d,e,f直接連通的路徑,以此類推其他行)
輸出就是最小的**線鋪設路徑
輸入樣例
603
0540
3010
0801
0304
5030
11040
01106
0840
60
輸出樣例
15
prim演算法假設初始時,只有乙個點是連線的,從這個點開始順次查詢連線外面最小花費的邊(用於稠密圖)
#include
#include
using
namespace std;
const
int inf =
1e8;
int a[55]
[55];
//a[i][j]表示從i到j的路徑長度
int dist[55]
;//已連線的點中,到下標index最小的路徑
int vis[55]
;long
long ans;
intmain()
}//下面是prim演算法
dist[1]
=0;//從v1開始順次連線,v1到v1,路徑為0
vis[1]
=1;//vis為1表示已經連線(可以通話了)
for(i =
2; i <= n; i++
) dist[0]
= inf;
//讓dist[0]最大,方便後面找到較小的路徑
for(i =
1; i <= n; i++)if
(mark ==0)
break
;//如果mark沒變,說明不存在連通的村莊了,退出迴圈
ans +
= dist[mark]
;//ans儲存總路徑,dist[mark]是當前最短的路徑,加上去
vis[mark]=1
;//第mark個村莊可以通話了
for(j =
1; j <= n; j++
)//因為可以通話的村莊範圍變了,需要重新更新dist的值
}printf
("%d\n"
, ans)
;//輸出結果
}
kruskal演算法假設初始時各個點都是單獨的孤島,路徑從小到大依次連線連通分支(用於稀疏圖)
#include
#include
#include
using
namespace std;
struct edge e[
2222];
int fa[55]
;int emax, num;
//emax表示可搭建的邊數,num表示已搭建的邊數
long
long ans;
intfind
(int x)
void
unity
(int a,
int b)
intcmp
(const
struct edge& a,
const
struct edge& b)
void
build
(int i,
int j,
int temp)
intmain()
for(i =
1; i <= n; i++)}
sort
(e, e + emax, cmp)
;//kruskal演算法需要按權值從小到大排序
i =1;
while
(num < n -1)
//n個村莊總共搭建n-1條邊
printf
("%d\n"
, ans)
;}
前面kruskal演算法的**有點醜
下面給出相對好一點的模板
模板參考:最小生成樹詳解+經典例題
#include
#include
#include
#include
using
namespace std;
struct nodea[
110]
;int pre[
110]
;//每個點的資訊; 並查集所用;
bool
cmp(
struct node a,
struct node b)
intfind
(int root)
// 查詢函式(並查集)
intmain()
if(num==n-1)
break
;// 滿足樹的性質; 邊的條數==點的個數-1;}if
(num==n-1)
//判斷是否存在;
printf
("%d\n"
,sum)
;else
printf
("?\n");
}return0;
}
最小生成樹(prim演算法)
最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...
最小生成樹 Prim演算法
prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...
最小生成樹 prim 演算法
一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...