hdu_1863_畅通工程_201403122000

畅通工程

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14215    Accepted Submission(s): 5875


Problem Description
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
 

 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
 

 

Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
 

 

Sample Input
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
 

 

Sample Output
3 ?
 

 

Source
 
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 //#include <algotithm>
 5 #include <stdlib.h>
 6 using namespace std;
 7 typedef struct IN
 8 {
 9     int a;
10     int b;
11     int c;
12 }IN;
13 IN s[5000];
14 int N,M;
15 int pre[110];
16 int cmp(const void *a,const void *b)
17 {
18     return (*(IN *)a).c - (*(IN *)b).c;
19 }
20 int find(int x)
21 {
22     int i,r,t;
23     r=x;
24     while(r!=pre[r])
25     r=pre[r];
26     while(x!=r)
27     {
28         i=pre[x];
29         pre[x]=r;
30         x=i;
31     }
32     return r;
33 }
34 int kruskal()
35 {
36     int i,j,pa,pb,num=0,sum=0;
37     for(i=0;i<=M;i++)
38     pre[i]=i;
39     for(i=0;i<N;i++)
40     {
41         pa=find(s[i].a);
42         pb=find(s[i].b);
43         if(pa!=pb)
44         {
45             pre[pa]=pb;
46             sum+=s[i].c;
47             num++;
48         }
49     }
50     if(num==M-1)
51     return sum;
52     else
53     return 0;
54 }
55 int main()
56 {
57     while(scanf("%d %d",&N,&M),N)
58     {
59         int i,j,t;
60         memset(s,0,sizeof(s));
61         for(i=0;i<N;i++)
62         scanf("%d %d %d",&s[i].a,&s[i].b,&s[i].c);
63         qsort(s,N,sizeof(s[0]),cmp);
64         //for(i=0;i<N;i++)
65         //printf("%d\n",s[i].c);
66         t=kruskal();
67         if(t)
68         printf("%d\n",t);
69         else
70         printf("?\n");
71     }
72     return 0;
73 }

 

转载于:https://www.cnblogs.com/xl1027515989/p/3597224.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值