HDU-1863 畅通工程

来源:互联网 发布:展示实时数据 时间轴 编辑:程序博客网 时间:2024/05/21 07:06
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 5000 + 5;int n, m, ans, cnt;bool flag;struct streat{    int op;    int ed;    int cost;    bool operator < (const streat Next) const    {        return cost < Next.cost;    }} edge[maxn];int root[105];int Find(int x){    return root[x] == x ? x : root[x] = Find(root[x]);}void Kruskal(){    ans = 0;    for(int i = 1; i <= m; i ++)        root[i] = i;    sort(edge, edge + n);    cnt = 0;    for(int i = 0; i < n; i ++)    {        int x = Find(edge[i].op);        int y = Find(edge[i].ed);        if(x != y)        {            root[y] = x;            ans += edge[i].cost;            cnt ++;        }        if(cnt == m - 1)        {            flag = true;            break;        }    }}int main(){    while(scanf("%d %d", & n, & m) && n)    {        for(int i = 0; i < n; i ++)            scanf("%d %d %d", & edge[i].op, & edge[i].ed, & edge[i].cost);        flag = false;        Kruskal();        if(flag)            printf("%d\n", ans);        else            printf("?\n");    }    return 0;}

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

0 0