-
题目描述:
-
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
-
输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
-
输出:
-
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
-
样例输入:
-
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
-
样例输出:
-
3 ?
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstdlib>
- #include<memory.h>
- #include<cstring>
- #define MAX 0xFFFFFFF
- using namespace std;
- int father[101];
- struct Node{
- int dis;
- int a,b;
- bool operator<(const Node& node)const{
- return dis<node.dis;
- }
- };
- Node nodes[101];
- int getfather(int i){
- if(i==father[i])
- return i;
- else{
- father[i] = getfather(father[i]);
- return father[i];
- }
- }
- void merge(int i, int j){
- father[i] = j;
- }
- int main(){
- //freopen("in.txt", "r", stdin);
- int n, m;
- int fa, fb;
- while(scanf("%d%d", &n, &m)!=EOF, n){
- for(int i=0;i<n;++i){
- scanf("%d%d%d", &nodes[i].a,&nodes[i].b,&nodes[i].dis);
- }
- sort(nodes, nodes+n);
- for(int i=1;i<=n;++i)
- father[i] = i;
- int total = 0;
- int w = 0;
- for(int i=0;i<n;++i){
- fa = getfather(nodes[i].a);
- fb = getfather(nodes[i].b);
- if(fa!=fb){
- total ++;
- w += nodes[i].dis;
- merge(fa, fb);
- }
- }
- if(total==m-1)
- printf("%d\n", w);
- else
- printf("?\n");
- }
- //fclose(stdin);
- }