Ⅰ 數據結構里提到的普里母和克魯斯卡爾分別是哪個國家的
普里母演算法和克魯斯卡爾方法求最小生成樹完整程序
1、普里姆演算法(Prim演算法),圖論中的一種演算法,可在加權連通圖里搜索最小生成樹。意即由此演算法搜索到的邊子集所構成的樹中,不但包括了連通圖里的所有頂點(英語:Vertex (graph theory)),且其所有邊的權值之和亦為最小。該演算法於1930年由捷克數學家沃伊捷赫·亞爾尼克(英語:Vojtěch Jarník)發現;並在1957年由美國計算機科學家羅伯特·普里姆(英語:Robert C. Prim)獨立發現;1959年,艾茲格·迪科斯徹再次發現了該演算法。因此,在某些場合,普里姆演算法又被稱為DJP演算法、亞爾尼克演算法或普里姆-亞爾尼克演算法
2、Kruskal演算法是一種用來尋找最小生成樹的演算法,由Joseph Kruskal在1956年發表。用來解決同樣問題的還有Prim演算法和Boruvka演算法等。三種演算法都是貪婪演算法的應用。和Boruvka演算法不同的地方是,Kruskal演算法在圖中存在相同權值的邊時也有效。
Ⅱ 關於克魯斯卡爾演算法中的一點疑問
這是因為採用了並查集這種數據結構。
set[]這個數組在演算法中所起的作用不是你想的那樣,你去看看並查集的知識,相信你一看就明白了。
Ⅲ 數據結構中圖的克魯斯卡爾演算法的基本思想是
基本思想是:設有一個有n個頂點的連通網路N={V,E},最 初先構造一個只有n個頂點,沒有邊的非連通圖 T={ V,¢},圖中每個頂點自成一個 連通分量。當在E中選到一條具有最小權值的邊時,若該邊的兩個頂點落在不同的連通 分量上,則將此邊加人到T中;否則將此邊捨去,重新選擇一條權值最小的邊。如此重復 下去,直到所有頂點在同一個連通分量上為止。
Ⅳ 數據結構中克魯斯卡爾演算法求無向帶權連通圖的最小生成樹
需要,你的結果是2棵樹(森林),結果要的是一棵樹,當然要連起來
Ⅳ 克魯斯卡爾演算法
哈哈,因為愛情。
parent數組裝的是每個連通分量的第一個開始點,最初的狀態有n個節點,n個分量,都是第一個,所以全都賦值0,而開始合並後,將一個個的分量逐步的合並到一起,parent記錄的就是父節點,一個聯通分量只有一個parent為0的。
而判斷循環是如果兩個的最終的開始節點是同一個,就說明你加上這條邊就形成循環了,這條邊就不能加
Ⅵ 2014數據結構高分筆記的克魯斯卡爾演算法,沒看懂。 getRoot函數那個是怎麼做到的
例:
int FindRoot(int a)
{
if(Tree[a]==-1)//沒有父節點,返回a
return a;
else
{
int tmp=FindRoot(Tree[a]);//存在父節點,遞歸返回離根最近的父節點id
Tree[a]=tmp;//將自己的父節點修改為最直接的父節點,使樹變矮,優化
return tmp;//返回父節點
}
}
不知道高分筆記的克魯斯卡爾演算法具體怎麼實現,但是原理如上
Ⅶ 數據結構克魯斯卡爾演算法,急求
第一步
v1--v2
第二步
v1--v2--v3
第三步
v1--v2--v3--v4
第四步
v1--v2--v3--v4--v5
第五步
v1--v2--v3--v4--v5
--v6
Ⅷ C語言數據結構 克魯斯卡爾演算法求無向網的最小生成樹。
//要用到並查集判斷迴路,代碼先給你吧,看不懂追問
#include<algorithm>
#include<stdio.h>
usingnamespacestd;
#defineMAXN1005//假設點數不超過1000
intn,m;
intfa[MAXN];
intid[MAXN];
structEdge{//邊的數據結構
intfrom,to;
intlen;
};
Edgeedge[MAXN*MAXN];
boolcmp(Edgea,Edgeb){//邊的比較函數
returna.len<b.len;
}
intfind(intx){//並查集,用於判斷是否與已選擇的邊構成環
if(fa[x]==-1)
returnx;
else
returnfa[x]=find(fa[x]);
}
voidKruskal(intn){
memset(fa,-1,sizeof(fa));//初始化fa數組
intcnt=0;
for(inti=0;i<m;i++){
intu=edge[i].from;
intv=edge[i].to;
intt1=find(u);//找第一個點的起始點
intt2=find(v);//找第二個點的起始點
if(t1!=t2){//如果不相等,則不構成迴路
fa[t1]=t2;
id[cnt]=i;
cnt++;
if(cnt==n-1)//當已選了n-1條邊時,退出循環
break;
}
}
}
intmain()
{
while(scanf("%d%d",&n,&m))
{
inta,b,c;
for(inti=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[i].from=min(a,b);
edge[i].to=max(a,b);
edge[i].len=c;
}
sort(edge,edge+m,cmp);
Kruskal(n);
for(inti=0;i<n-1;i++)
{
intt=id[i];
printf("%d%d%d ",edge[t].from,edge[t].to,edge[t].len);
}
}
return0;
}