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; }
相关文章推荐
- hdu 1863 畅通工程
- hdu_1863 畅通工程
- HDU 1863 畅通工程(Kruskal)
- hdu 1863 畅通工程
- 【HDU 1863】畅通工程
- hdu 1863 畅通工程(MST,prim)
- HDU 1863 畅通工程(最小生成树prim算法)
- HDU 1863 畅通工程
- hdu 1863畅通工程(prim,邻接矩阵)
- hdu 1863 畅通工程
- HDU 1863 畅通工程 最下生成树问题
- 畅通工程 HDU - 1863
- hdu1863-畅通工程
- 【1863】畅通工程 (HDU)
- HDU 1863 畅通工程
- HDU - 1863[畅通工程] 最小生成树Kruskal
- HDU-畅通工程-1863
- HDU 1863 畅通工程 (最小生成树
- HDU 1863 畅通工程
- HDU 1863 畅通工程