【发布时间】:2017-04-16 20:20:08
【问题描述】:
下面是 Kruskal 算法 的 C++ 代码,用于查找我的导师给出的图的最小成本生成树。
我没有很好地理解代码。我想确切地知道代码的哪一部分正在检查不断增长的包含边森林中的循环形成。
我也想知道parent[]数组的具体用途是什么。
另外,它是否比使用 DFS(深度优先搜索)检查循环更好?
代码如下:
#include<stdio.h>
#include<stdlib.h>
int i, j, k, a, b, u, v, n, ne = 1;
int min, mincost = 0, cost[9][9], parent[9];
int find(int);
int uni(int, int);
int main()
{
printf("\n\tImplementation of Kruskal's algorithm\n");
printf("\nEnter the no. of vertices:");
scanf("%d",&n);
printf("\nEnter the cost adjacency matrix:\n");
for (i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
scanf("%d",&cost[i][j]);
if(cost[i][j] == 0)
cost[i][j] = 999;
}
}
printf("The edges of Minimum Cost Spanning Tree are\n");
while(ne < n)
{
for(i = 1, min = 999; 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("%d edge (%d, %d) =%d\n", ne++, a, b, min);
mincost += min;
}
cost[a][b] = 999;
}
printf("\n\tMinimum cost = %d\n",mincost);
}
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;
}
注意:
我知道代码有点混乱,如果用户输入的值超过9,用户输入将导致失败,但我不想在不了解它是如何工作的情况下专注于该部分.我只知道它选择了最小成本边缘,检查它是否形成循环,然后将其值设置为无穷大(此处为999)。我不知道它是如何以及在哪里检查循环形成的。请帮忙解释一下。
【问题讨论】:
-
大家的时间有限。如果代码不是很短且呈现良好,您将很难找到有人为您解释您的代码。
int i,j,k,a,b,u,v,n,ne=1;到底是什么?我们应该如何解释它们各自的含义? -
与流行的看法相反,没有“C/C++”语言。您必须确定您使用的是 C 还是 C++,并相应地编辑您的问题。
-
我知道没有这样的 lang。而且我认为不存在如此流行的信念。我只想说,上面的代码同时适用于 C 编译器和 C++ 编译器。这不是我担心的代码,而是它用于检查循环是否存在的逻辑。
-
@50calrevolver,我们这些经常使用 SO 的人都知道,许多在这里提出问题的人确实似乎没有认识到 C 和 C++ 是不同的语言,既不是其他语言的子集。如果在两者的共同子集中编写确实对您很重要——这不是一项微不足道的任务——那么就这么说吧。否则,选择一个。
-
我不会对任何在理解包含
int i,j,k,a,b,u,v,n,ne=1;之类的程序有困难的人提出异议。
标签: c++ algorithm minimum-spanning-tree kruskals-algorithm