/**
* 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;
}
poj2395 Kruskal最小生成树
最新推荐文章于 2019-03-09 11:03:03 发布