关闭

最小生成树

标签: C++最小生成树prim算法
92人阅读 评论(0) 收藏 举报
分类:

一个国家有n个城市。若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能够找出最小费用及其一种连接方案。

输入描述 Input Description

    输入文件的第一行是n的值(n<=100).

    第二行至第n+1行是一个n*n的矩阵,第i行第j列的数如果为0表示城市i与城市j有电话线连接,否则为这两个城市之间的连接费用(范围不超过10000)。

输出描述 Output Description

       输出文件的第一行为你连接的电话线总数m,第二行至第m+1行为你连接的每条电话线,格式为i j,(i<j), i j是电话线连接的两个城市。输出请按照Prim算法发现每一条边的顺序输出,起始点为1.

       第m+2行是连接这些电话线的总费用。

样例输入 Sample Input

5

0 15 27 6 0

15 0 33 19 11

27 33 0 0 17

6 19 0 0 9

0 11 17 9 0

样例输出 Sample Output

2

1 4

2 5

17

借这个题目来说一下prim算法:先任取一个点a,然后找到距离这个点最近的点b,再找距这两个点最近的点c,在更新一下,以a点和b点为基准再找句这两个点最近的点,以此类推。


#include<stdio.h>

int n;
int A[110][110];
int B[110];
int C[110];
int D[110];
int E[110];


int Prim(int n)
{
    int i,p,sum=0,min=-1,mith=0;
    for(i=1;i<=n;i++)B[i]=A[1][i];
    for(i=1;i<=n;i++){E[i]=C[i]=0;D[i]=1;}C[1]=1;E[1]=1;
    for(i=2;i<=n;i++)
        {for(p=1;p<=n;p++)
                {if(B[p]!=-1&&E[p]==0)
                  if(min==-1||B[p]<min)
                    {min=B[p];mith=p;}
                 }
            sum+=min;C[i]=mith;E[mith]=1;
            for(p=1;p<=n;p++)
                {if(A[mith][p]!=-1&&E[p]==0)
                        if(A[mith][p]<B[p]){B[p]=A[mith][p];D[p]=mith;}
                }
            min=-1;mith=0;
         }


    return sum;
    }
int main()
{
    int i,p,t=0,j=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        for(p=1;p<=n;p++)
            {scanf("%d",&A[i][p]);if(i==p)A[i][p]=-1;;
              }
    p=Prim(n);


  for(i=1;i<=n;i++)if(B[i]!=0&&B[i]!=-1)t++;printf("%d\n",t);
    for(i=1;i<=n;i++)
        if(B[C[i]]!=0&&B[C[i]]!=-1){if(C[i]<D[C[i]])printf("%d %d\n",C[i],D[C[i]]);else printf("%d %d\n",D[C[i]],C[i]);}
        printf("%d",p);
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:513次
    • 积分:63
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档