hdu 2122
2015-08-12 16:28
302 查看
kruskal模板题;
当然也可以不使用STL,这份模板可能理解上难度大一些,加上一些注释;
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; int n, m; struct Edge{ int u, v, w; void addEdge(int n_u = 0, int n_v = 0, int n_w = 0){ u = n_u; v = n_v; w = n_w; } }edge; vector<Edge> evec; int p[1005], cnt; bool cmp(const Edge &a, const Edge &b){ return a.w < b.w; } void K_init(){ cnt = 0; //初始化cnt ,cnt记录建立了多少条边; for(int i = 0; i < n; ++i) p[i] = i; sort(evec.begin(), evec.end(), cmp); } int Find(int x){ return x == p[x] ? x : p[x] = Find(p[x]); //路径压缩优化; } void Union(int x, int y){ int xRoot = Find(x); int yRoot = Find(y); p[xRoot] = yRoot; } int Kruskal(){ K_init(); int ans = 0; for(int i = 0; i < m; ++i){ if(Find(evec[i].u) != Find(evec[i].v)){ ans += evec[i].w; Union(evec[i].u, evec[i].v); cnt++; } } return ans; } int main() { while(scanf("%d%d", &n, &m) != EOF){ int u, v, w; for(int i = 0; i < m; ++i){ scanf("%d%d%d", &u, &v, &w); edge.addEdge(u, v, w); evec.push_back(edge); } int ans = Kruskal(); if(cnt != n-1) printf("impossible\n"); else printf("%d\n", ans); printf("\n"); evec.clear(); } return 0; }
当然也可以不使用STL,这份模板可能理解上难度大一些,加上一些注释;
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; int n, m; int u[10005], v[10005], w[10005], r[10005]; // r间接排序; int p[1005], cnt; bool cmp(const int a, const int b){ return w[a] < w[b]; } void K_init(){ cnt = 0; //初始化cnt ,cnt记录建立了多少条边; for(int i = 0; i < n; ++i) //初始化并查集; p[i] = i; for(int i = 0; i < m; ++i) //初始化边序号; r[i] = i; sort(r, r+m, cmp); //间接排序; } int Find(int x){ return x == p[x] ? x : p[x] = Find(p[x]); //路径压缩优化; } int Kruskal(){ K_init(); int ans = 0; for(int i = 0; i < m; ++i){ int e = r[i]; int x = Find(u[e]); int y = Find(v[e]); if(x != y){ //如果在不同集合,合并; ans += w[e]; p[x] = y; cnt++; } } return ans; } int main() { while(scanf("%d%d", &n, &m) != EOF){ for(int i = 0; i < m; ++i){ scanf("%d%d%d", &u[i], &v[i], &w[i]); } int ans = Kruskal(); if(cnt != n-1) printf("impossible\n"); else printf("%d\n", ans); printf("\n"); } return 0; }
相关文章推荐
- SG函数
- c/c++ static 对象
- poj2393解题报告c语言
- C#实现将一个矩阵分解为对称矩阵与反称矩阵之和的方法
- Fix the issues identified by lint, or add the following to your build script...
- USB 总线引脚定义
- Shredding Company
- 120. Triangle
- [Leetcode] Permutations II
- Shredding Company
- IDE、SATA、SCSI、SAS、FC、SSD 硬盘类型
- TCP/IP传输层,你懂多少?
- HDU 4730 We Love MOE Girls
- 明明的随机数
- Swap Nodes in Pairs
- 20150812-如何在IAR中通过Watch窗口观察局部变量的值
- 快快快!27个提升效率的iOS开源库推荐
- (ZZ)深入理解Linux修改hostname
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- js实现图片轮播效果