C语言中的Kruskal算法及其作用

时间:2019-06-03 03:02:26

标签: c kruskals-algorithm

我有我的教授给我的这段代码,用于使用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;
}

我只是想对我上面提到的三件事做一个解释。除了我所说的三件事之外,我了解该算法的工作原理。

谢谢

1 个答案:

答案 0 :(得分:1)

此代码最多支持10个顶点。

  • parent正在跟踪节点的父级。
  • find用于查找没有任何父级的集合(例如A)中的顶点。 因此,如果u在集合A中,而v在集合B中,则这两个集合将通过uni函数进行合并。

此代码有效,但不是您的代码。

关于算法本身:

Kruskal是一种贪婪算法,用于以最小(或最大成本)找到最小生成树。算法如下:

  • 按升序或降序排列所有权重。
  • 以最小(或最大成本)找到边缘。
  • 如果边为uv,请检查uv是否属于同一集合。如果是,则不重复步骤2。
  • 如果没有并集,则存在uv的集合,即,如果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