您的位置:首页 > 其它

hdu 1863 畅通工程(图论:最小生成树+并查集)

2014-07-20 19:16 253 查看
题目是很简单的最小生成树

但是有一个问题就是根据给出的数据能不能构成一个连通M个城市的最小生成树

我觉得用并查集来检查所有的城市是否归入一个集合即可

这样代码就很简单了,只需在Kruskal上加一个判断即可

0ms代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define LL long long
using namespace std;

LL ans;
int m, n;
int u[MAXN], v[MAXN], w[MAXN];
int p[MAXN], r[MAXN];

int cmp(int i, int j) {
return w[i] < w[j];
}

int find(int x) {
return x==p[x] ? x : p[x] = find(p[x]);
}

bool Kruskal() {
int i, x, y, e, cnt;
ans = 0;
for(i=1; i<=m; ++i)//初始化从1开始,对应1-m个城市
p[i] = i;
for(i=0; i<n; ++i)
r[i] = i;
sort(r, r+n, cmp);
for(i=0; i<n; ++i) {
e = r[i];
x = find(u[e]);
y = find(v[e]);
if(x != y) {
ans += w[e];
p[x] = y;
}
}
cnt = 0;
for(i=1; i<=m; ++i) {//判断是否所有节点共用一个根
if(p[i] == i)
cnt++;
}
if(cnt == 1)
return true;
return false;
}

int main(void) {
int i;
while(cin >> n >> m, n) {
for(i=0; i<n; ++i) {
cin >> u[i] >> v[i] >> w[i];
}
if(Kruskal())
cout << ans << endl;
else cout << "?" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: