poj2395 Kruskal最小生成树
2014-03-18 00:37
197 查看
/** * poj2395 最小生成树 Kruskal算法(加边法) * 就是个最小生成树,只是记录的是最大边的边长而已。环路检测可以用并查集。并查集好多次忘了要用父点做为操作点了,WA了好多次 */ #include <cstdio> #include <algorithm> using namespace std; struct road{ int a; int b; int dist; }r[10001]; int n,m; int father[2001]; int points[2001]; int max_len=0; bool cmp(const road &a,const road &b){ return a.dist < b.dist; } int min(int a,int b){ return a<b?a:b; } int getfather(int x){ if(x==father[x]){ return x; } else{ return father[x]=getfather(father[x]); } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ father[i] = i; exist[i] = false; points[i] = 1; } for(int i=1;i<=m;++i){ scanf("%d%d%d",&r[i].a,&r[i].b,&r[i].dist); } sort(r+1,r+m+1,cmp); int s_idx,b_idx,fa,fb; for(int i=1;i<=m && points[1]<n;++i){ if(i>1){ if(r[i-1].a == r[i].a && r[i-1].b == r[i].b){ continue;//重边检测 } } fa = getfather(r[i].a); fb = getfather(r[i].b); if(fa != fb){//检测有无环路 s_idx = min(fa,fb); b_idx = fa+fb-s_idx; father[b_idx] = getfather(s_idx); points[s_idx] += points[b_idx]; if(max_len < r[i].dist){ max_len = r[i].dist; } } } printf("%d\n",max_len); return 0; }
相关文章推荐
- HDU 5624 KK's Reconstruction(最小生成树-Kruskal)
- kruskal最小生成树
- 蓝桥杯练习题 最小方差生成树 (Kruskal MST 好题)
- HDU 4750 最小生成树 kruskal
- Poj 2395 最小生成树(Kruskal 算法)
- 最小生成树之KRUSKAL
- poj 1679 判断最小生成树是否唯一(kruskal)
- 最小生成树——Prim、Kruskal、Sollin(Boruvka)
- 算法提高 最小方差生成树 (kruskal)
- 并查集+Priority_Queu+Kruskal实现最小生成树
- hdu4786Fibonacci Tree【kruskal最小生成树】
- java数据结构和算法------图(最小生成树Kruskal)
- hdu 1233(最小生成树kruskal)
- POJ2395 最小生成树 - Prime算法
- BZOJ 2429: [HAOI2006]聪明的猴子|最小生成树kruskal
- UVA11354[Bond] 倍增求LCA+Kruskal求最小瓶颈生成树
- HDU 1233 还是畅通工程(最小生成树kruskal)
- 百练+最小生成树+赤裸裸的Kruskal
- poj2395(最小生成树最大边)
- POJ - 1751Highways最小生成树kruskal