最小生成树 prim

来源:互联网 发布:淘宝 seo 教程 编辑:程序博客网 时间:2024/05/29 19:30
    #include "stdio.h"  
    #include "stdlib.h"  
    #define MAX 110  
    int a[MAX][MAX],p[MAX];  
      
    int main(void)  
    {  
        int i,j,k,n,t,min,sum,new_point,x,y,d;  
        printf("请输入顶点的个数:");  
        scanf("%d",&n);  
        t=n*(n-1)/2;
        for(i=0;i<MAX;i++){
            p[i] = 0;
        }
        //memset(p,0,sizeof(p));   //将p数组初始化为0  
        printf("请输入每条边的起始端点、权值:/n");  
        for(i=0;i<t;i++)  
        {  
            scanf("%ld%ld%ld",&x,&y,&d);   //输入每条边的权值  
            a[x][y]=a[y][x]=d;  
        }  
        p[1]=1;  
        sum=0;  
        for(k=0;k<n-1;k++)  
        {  
            min=-1;  
            for(i=1;i<=n;i++)  
            {  
                if(p[i]==1)  
                {  
                    for(j=1;j<=n;j++)  
                    {  
                        if(p[j]==0 && (min==-1 || min>a[i][j]))  
                        {  
                            min=a[i][j];   //从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边  
                            new_point=j;  
                        }  
                    }  
                }  
            }  
            p[new_point]=1;  
            sum+=min;  
      
        }  
        printf("最小生成树的权值为:%d/n",sum);  
        system("pause");  
        return 0;  
    }  

0 0
原创粉丝点击