您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: