题目1024:畅通工程

来源:互联网 发布:电视剧网络播放量查询 编辑:程序博客网 时间:2024/05/19 23:56
/*题目描述:    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。输入:    测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。输出:    对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。样例输入:3 31 2 11 3 22 3 41 32 3 20 100样例输出:3?*/#include <iostream>#include <fstream>#include <cstring>#include <cstdlib>using namespace std;const int M = 100 + 10;const int N = M * (M - 1) / 2;int p[M];int u[M];int v[M];int cost[M];int m, n;int id[M];int cmp(const void *a, const void *b);int find(int x);int main(){    #ifndef ONLINE_JUDGE        ifstream cin("d:\\OJ\\uva_in.txt");    #endif // ONLINE_JUDGE    while (cin >> n >> m) {        if (n == 0) break;        memset(p, -1, sizeof(p));        for (int i = 1; i <= n; i++) {            id[i] = i;            cin >> u[i] >> v[i] >> cost[i];        }        qsort(&id[1], n, sizeof(int), cmp);        int ans = 0;        for (int i = 1; i <= n; i++) {            int a = find(u[id[i]]);            int b = find(v[id[i]]);            if (a != b) {                ans += cost[id[i]];                p[b] = a;            }        }        int cnt = 0;        for (int i = 1; i <= m; i++) {            if (p[i] < 0)                cnt++;        }        if (cnt > 1)            cout << "?" << endl;        else {            cout << ans << endl;        }    }    return 0;}int cmp(const void *a, const void *b){    int *pa = (int *)a;    int *pb = (int *)b;    return cost[*pa] - cost[*pb];}int find(int x){    return p[x] < 0 ? x: p[x] = find(p[x]);}

原创粉丝点击