我有我的教授给我的这段代码,用于使用Kruskal算法查找MST。但是,我不完全了解
的需求int parent[10]
是以及我们使用这些功能时发生的情况
find()
和
uni()
下面是他给我们的完整代码。
#include <stdio.h>
int parent[10];
int find(int i)
{
while(parent[i])
{
i=parent[i];
}
return i;
}
int uni(int i,int j)
{
if(i!=j)
{
parent[j]=i;
return 1;
}
return 0;
}
int main(void)
{
int cost[10][10],u,v,i,j,min,mincost=0,n,ne=1,a,b;
printf("Enter no. of vertices: ");
scanf("%d",&n);
printf("Enter Adjacency Matrix:\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&cost[i][j]);
}
}
while(ne<n)
{
min=999;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(cost[i][j]<min)
{
min=cost[i][j];
a=u=i;
b=v=j;
}
}
}
u=find(u);
v=find(v);
if(uni(u,v))
{
printf("\n%d edge(%d -> %d)=%d",ne++,a,b,min);
mincost += min;
}
cost[a][b]=cost[b][a]=999;
}
printf("\nMin. cost of spanning tree=%d",mincost);
return 0;
}
我只是想对我上面提到的三件事做一个解释。除了我所说的三件事之外,我了解该算法的工作原理。
谢谢
答案 0 :(得分:1)
此代码最多支持10个顶点。
parent
正在跟踪节点的父级。find
用于查找没有任何父级的集合(例如A)中的顶点。
因此,如果u在集合A中,而v在集合B中,则这两个集合将通过uni
函数进行合并。此代码有效,但不是您的代码。
关于算法本身:
Kruskal是一种贪婪算法,用于以最小(或最大成本)找到最小生成树。算法如下:
uv
,请检查u
和v
是否属于同一集合。如果是,则不重复步骤2。u
和v
的集合,即,如果u在集合A中,而集合B中的v则将联合A和B设为C并丢弃A和B。现在{{ 1}}和u
属于C。从步骤2开始重复。这是一个更好的代码: https://github.com/26prajval98/DSA/blob/master/graph%20algorithms/kruskal/main.c