我正在学习Kruskal算法,该算法用于查找给定图的最小生成树(MST),基本概念是将所有顶点初始视为森林。然后,找到最小边并将边的顶点合并成一棵树。一直递归执行此过程,直到只剩下包含所有顶点的一棵树。
我看到了以下实现:
#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 循环究竟是做什么的?
编辑:还有它们的必要性-
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(w[i][j]==0)
w[i][j]=999;
if(u!=v)
语句检查代表是否不同,以确保没有循环。我是对的吗? - Chaitanya Nettem