工事を順調に進める

2299 ワード

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=41768#problem/E
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 ?
 
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[1005],n;
struct note
{
    int x,y,z;
};
int cmp(note a,note b)
{
    return a.z<b.z;
}
void ini()
{
    for(int i=0;i<=n;i++)
    {
        a[i]=i;
    }
}
int find(int x)
{
    if(x==a[x])
        return x;
    return a[x]=find(a[x]);
}
void un(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)
       return;
    if(x>y)
    {
      a[x]=y;
    }
    else if(x<y)
    {
        a[y]=x;
    }
}
int main()
{
    int m,x,y;
    note ab[1005];
    while(~scanf("%d%d",&m,&n))
    {
        if(m==0)
            break;
        ini();
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&ab[i].x,&ab[i].y,&ab[i].z);
        }
        sort(ab,ab+m,cmp);
        int cot=0;
        int sum=0;
        for(int i=0;i<m;i++)
        {
            if(find(ab[i].x)!=find(ab[i].y))
            {
                un(ab[i].x,ab[i].y);
                sum+=ab[i].z;
                cot++;
                if(cot==n-1)
                   break;
            }
        }
        if(cot<n-1)
             printf("?
"); else printf("%d
",sum); } return 0; }