我正在研究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
这个例子帮了很多! :) –