最小生成树之prim算法

最小生成树之prim算法  


注意:prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图。





从随便一个点开始(一般从v1)把这个点放到集合U里面

找出与这个点相连并且最短的边,且这条边的另一个点不在集合U里面

然后把这条边的另一个点放到集合U里面


然后继续从图中找出与集合U里面的点相连且最短的边

且这条边的另一个点不在集合U里面

扫描二维码关注公众号,回复: 2160590 查看本文章

并把与这条边相连又不在集合U里面的点放到集合U里面

重复上述

直到所有点都放在集合里面




#include<stdio.h>
#include<stdlib.h>
#define max 1000000000;
int LJJZ[101][101],JIHE[101],vis[101];
int main()
{
    int i,j,n;

    scanf("%d",&n);

    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            scanf("%d",&LJJZ[i][j]);///构图
        }
    }
    JIHE[0]=1;
    vis[1]=1;
    int t=1;
    int sum=0;
    int min;
    int minJ;
    int flag;
    while(t<n)
    {
        min=max;
        flag=0;
        for(i=0; i<t; i++)
        {
            for(j=1; j<=n; j++)
            {
                if(LJJZ[JIHE[i]][j]<min&&vis[j]==0)
                {
                    min=LJJZ[JIHE[i]][j];
                    //printf("min:%d\n",min);
                    minJ=j;
                    flag=1;
                }
            }
        }
        if(flag==1)
        {
            sum=sum+min;
            JIHE[t]=minJ;///集合U
            //printf("JIHE:%d\n",JIHE[t]);
            vis[minJ]=1;
            t++;
        }
    }
    printf("%d\n",sum);

    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_42390424/article/details/81051299