您的位置:首页 > 其它

HDU - 1863 畅通工程

2016-12-11 13:46 323 查看
解题思路:并查集。根据造价排序,价格少的优先,如果不在同一个集合就合并,加上价格。最后判断有几个集合,若大于 1 个就说明所给方案不能连接所有村庄,输出 ?

#include <iostream>
#include <algorithm>
using namespace std;
struct node {
int a, b, v;
};
node p[1010];
int fa[1010];
int gf(int x) {
if (fa[x] == x) return x;
fa[x] = gf(fa[x]);
}
bool judge(int x, int y) {
int fx = gf(x);
int fy = gf(y);
if (fx == fy) return 1;
fa[fx] = fy;
return 0;
}
bool cmp (node a, node b) {
return a.v < b.v;
}
int main() {
int N, M;
while (scanf("%d%d", &N, &M) && N) {
for (int i = 0; i < N; i++)
scanf("%d%d%d", &p[i].a, &p[i].b, &p[i].v);
for (int i = 0; i <= M; i++) fa[i] = i;
sort (p, p+N, cmp);
int sum = 0;
for (int i = 0; i < N; i++) {
if (!judge(p[i].a, p[i].b))
sum += p[i].v;
}
int flag = 0;
for (int i = 1; i <= M; i++)
if (fa[i] == i) flag++;

if (flag == 1) cout << sum << endl;
else cout << "?" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: