我正在研究Kruskal的算法,用於查找給定圖的MST,並且我理解基本概念,您必須首先將所有頂點視爲林。之後,您必須找到最小邊並將邊的頂點連接到一棵樹中。遞歸地做這件事,直到只剩下一棵包含所有頂點的樹。C實現MST的Kruskal算法
我碰到了這個算法的以下實現。
#include<iostream.h>
int p[10];
void kruskal(int w[10][10],int n)
{
int min,sum=0,ne=0,i,j,u,v,a,b;
for(i=1;i<=n;i++)
p[i]=0;
while(ne<n-1)
{
min=999;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(w[i][j]<min)
{
min=w[i][j];
u=a=i;
v=b=j;
}
}
while(p[u])
u=p[u];
while(p[v])
v=p[v];
if(u!=v)
{
ne++;
sum+=min;
cout<<"\nedge "<<a<<"-->"<<b<<" is "<<min;
p[v]=u;
}
w[a][b]=w[b][a]=999;
}
cout<<"\nmin cost spanning tree= "<<sum;
}
void main()
{
int w[10][10],n,i,j;
clrscr();
cout<<"enter no.of vertices\n";
cin>>n;
cout<<"enter weight matrix\n";
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>w[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(w[i][j]==0)
w[i][j]=999;
kruskal(w,n);
}
什麼,我不明白的是,需要:
while(p[u])
u=p[u];
while(p[v])
v=p[v];
究竟是什麼這兩個while循環呢?
編輯:也有必要OF-
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(w[i][j]==0)
w[i][j]=999;
這是什麼意思的組件在這裏?已經作爲MST的一部分添加的頂點? –
@guy,克魯斯卡爾有中間步驟,其中兩個連接的組件被合併。如果添加新邊緣,它必須位於兩個連接的組件之間。這些組件存儲在'p'中。 – phimuemue
這個例子幫了很多! :) –