hdu 1863 畅通工程(图论:最小生成树+并查集)
2014-07-20 19:16
253 查看
题目是很简单的最小生成树
但是有一个问题就是根据给出的数据能不能构成一个连通M个城市的最小生成树
我觉得用并查集来检查所有的城市是否归入一个集合即可
这样代码就很简单了,只需在Kruskal上加一个判断即可
0ms代码如下:
但是有一个问题就是根据给出的数据能不能构成一个连通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; }
相关文章推荐
- HDU1863 畅通工程 【图论】【最小生成树】
- 【最小生成树+Prim】杭电 hdu 1863 畅通工程
- HDU 1863 畅通工程
- HDU 1863 畅通工程
- hdu 1863 畅通工程
- hdu1863 畅通工程
- HDU 1863 畅通工程(最小生成树prim算法)
- hdu 1863 畅通工程
- hdu 1863 畅通工程
- 畅通工程 hdu1863
- 【最小生成树】hdu 1863 畅通工程
- HDU 1863 畅通工程
- HDU 1863 畅通工程
- hdu 1863 畅通工程
- hdu 1863 畅通工程 (prim)
- Hdu 1863畅通工程 程序参考
- HDU 1863 畅通工程
- HDU 1863 畅通工程
- HDU 1863 畅通工程
- hdu 1863 畅通工程