特定のグラフの MST を見つけるためのクルスカルのアルゴリズムを研究していましたが、最初はすべての頂点をフォレストと見なす必要があるという基本的な概念を理解しています。その後、最小エッジを見つけて、エッジの頂点を 1 つのツリーに結合する必要があります。そして、すべての頂点を含むツリーが 1 つだけになるまで、これを再帰的に実行します。
そして、このアルゴリズムの次の実装に出くわしました。
#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];
これら 2 つの while ループは正確には何をするのでしょうか?
編集:そしてまた必要性-
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(w[i][j]==0)
w[i][j]=999;