杭电1233--还是畅通工程(最小生成…

Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路 总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
Sample Output
3 5

# include<stdio.h>

# include<string.h>

#define MAX 10000000

int main()

{

       int i,j,k,n,n1,t,a[101][101],b[101],sum,min;//a[i][j]存的是i点到j点的权值,就是路程;b[i]标记已联通的点

       while(scanf("%d",&n),n!=0)

       {

              n1=n;

              n=n*(n-1)/2;

              memset(b,0,sizeof(b));

              memset(a,0,sizeof(a));

              for(i=1;i<=n;i++)

              {

                     scanf("%d%d",&j,&k);

                     scanf("%d",&a[j][k]);

                     a[k][j]=a[j][k];

              }

              for(i=1;i<=n1;i++)

                for(j=i;j<=n1;j++)

                {

                       if(i!=j&&a[i][j]==0)

                              a[i][j]=a[j][i]=MAX;

                }

              b[1]=1;sum=0;

              for(i=1;i<n1;i++)

              {

                     min=MAX;

                     for(j=1;j<=n1;j++)

                     {

                            if(b[j])//双重for循环,找到所有未联通的点到所有以联通点的最小距离

                            {

                                   for(k=1;k<=n1;k++)

                                          if(b[k]==0&&min>a[j][k])

                                          {

                                                 min=a[j][k];

                                                 t=k;

                                          }

                            }

                     }

                     b[t]=1;

                     sum+=min;                                              

              }

              printf("%d\n",sum);            

       }

       return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值