poj Out of hay 最小生成树 kruscal

题目链接

题意 就是求最小生成树中最大的那条边,题目看了n 久才看懂。

直接采用的是kruscal 算法,并查集+快排。

原先以为会好难~~ 其实并查集用一句话就搞定了,快排结构体 简单爆了

post code:

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct edge{
     int x,y,w;       
}a[20000];
int fa[3000];
int n,m;
int cmp(edge a,edge b){    //quick sort from small to big
      return a.w<b.w;    
}
int Find(int i){              // disjoint set to distinguish different node
   if(i==fa[i])return i;
   fa[i]=Find(fa[i]);
   return fa[i];    
}

int kruscal(){              // pattern of kruscal
   int fax,fay,max=-1;
   for(int i=1;i<=m;i++){
       fax=Find(a[i].x);
       fay=Find(a[i].y);
       if(fax!=fay){
          if(max<a[i].w)max=a[i].w;
          fa[fax]=fay;             
       }
   }
   return max;  
}
int main(){
   while(scanf("%d%d",&n,&m)!=EOF){
         int ans;
         for(int i=1;i<=n;i++)
            fa[i]=i;
         for(int i=1;i<=m;i++)
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
         sort(a+1,a+1+m,cmp);
         ans=kruscal();                                          
         printf("%d\n",ans);
   }
   return 0;
} 
/*
4 6
1 2 23
2 3 1000
1 3 43
1 4 60
1 4 70
3 4 50
*/




你可能感兴趣的:(算法)