杭电1879 继续畅通工程
2017-07-23 11:44
162 查看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1879
思路:
这是最小生成树的基础题,正好再用一下并查集。这里有一个不一样的地方是,有可能路已经修好了,这时候需要做一下转化,就是修好之后,那这两个点之间的花费就设置成0。
其他需要注意的地方:
1.这道题卡了scanf,1000ms用cin超时,用scanf只需要500ms,所以,以后全用scanf和printf。
2.并查集那里,find函数以后每次都更新set,代码中写了注意的事情。
3.cmp函数那里,如果从小到大排序,不要用<=,用<
思路:
这是最小生成树的基础题,正好再用一下并查集。这里有一个不一样的地方是,有可能路已经修好了,这时候需要做一下转化,就是修好之后,那这两个点之间的花费就设置成0。
其他需要注意的地方:
1.这道题卡了scanf,1000ms用cin超时,用scanf只需要500ms,所以,以后全用scanf和printf。
2.并查集那里,find函数以后每次都更新set,代码中写了注意的事情。
3.cmp函数那里,如果从小到大排序,不要用<=,用<
#include <algorithm> #include <cstring> #include <cstdio> #include <iostream> #include <queue> #include "stdio.h" using namespace std; struct edge { int start, end, dis, flag; }; edge node[6000]; bool cmp(edge a, edge b) { return a.dis < b.dis; //如果从小到大,就这样。 /* if (a.dis < b.dis) return true; //注意!!用<,不要用<= else return false;*/ } int set[105];//描述每个节点的祖先 int find(int r) { //注意!!高端玩法,每次都更新一下set return set[r] == r ? r : set[r] = find(set[r]); } bool merge(int i, int j) { int x = find(i); int y = find(j); if (x != y) { set[x] = y; return true; } return false; } int main() { int n; while (true) { scanf("%d", &n); int ans = 0; if (n == 0) break; for (int i = 0; i < 105; i++) { set[i] = i; } int t = n*(n - 1) / 2; for (int i = 0; i < t; i++){ scanf("%d%d%d%d", &node[i].start, &node[i].end, &node[i].dis, &node[i].flag); if (node[i].flag == 1) node[i].dis = 0; //如果已经建完,直接把花费赋值为0 } sort(node, node + t, cmp); for (int i = 0; i < t; i++) { if (merge(node[i].start, node[i].end)) ans += node[i].dis; } printf("%d\n", ans); } return 0; }
相关文章推荐
- 杭电 1879 继续畅通工程【最小生成树&&Kruskal】
- 【最小生成树+kruskal】杭电 hdu 1879 继续畅通工程
- 杭电-1879继续畅通工程(kruskal)
- 杭电--1879--继续畅通工程--并查集
- 杭电 1879 继续畅通工程
- 杭电-1879继续畅通工程(kruskal,prim)
- 【杭电】[1879]继续畅通工程
- 【杭电oj】1879 - 继续畅通工程(最小生成树)
- 杭电oj1879 继续畅通工程
- 杭电1879继续畅通工程
- 杭电1879继续畅通工程
- 杭电1879 继续畅通工程
- 杭电1879--继续畅通工程(最小生成…
- 【HDU 1879】继续畅通工程
- HDU 1879 - 继续畅通工程
- hdu 1879 继续畅通工程
- HDU 1879 继续畅通工程
- hdu 1879 继续畅通工程
- HDU 1879 继续畅通工程
- HDUOJ---1879 继续畅通工程