【发布时间】:2019-06-03 03:02:26
【问题描述】:
我有我的教授给我的关于使用 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;
}
我只是在寻找对我上面所说的三件事的解释。除了我所说的三件事之外,我了解算法的工作原理。
谢谢
【问题讨论】:
-
关于:
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]); } }如果n大于 9,则由于访问超出矩阵的末尾cost[][]可悲的是,没有检查这种无效值(就像没有检查来自scanf()的返回值以确保操作成功 -
在 C 中,数组索引从 0 开始,而不是 1,因此
cost[][]数组的第一行和每行的第一列永远不会被设置为任何已知值 -
关于:
for(j=1;j<=n;j++) { scanf("%d",&cost[i][j]); }如果扫描的值 >9 或小于 0 那么结果(在函数中:find())是未定义的行为。 -
关于:
cost[a][b]=cost[b][a]=999;在find()函数中,由于访问超出cost[][]数组的末尾,这将导致未定义的行为
标签: c kruskals-algorithm