#include<stdio.h> //Kruskal算法
#include<algorithm>
using namespace std;
struct node{
int e,s,w;
};
node rode[10010];
struct bigger{
bool operator()( const node &a1, const node &a2 )
{
return a1.w < a2.w;
}
};
int f[10010];
int getf( int n ){ // 为并查集的内容
if( f[n]==n )
return n;
else
f[n]=getf(f[n]);
return f[n];
}
int Uion( int v, int u ){ // 连接两个结点 联合
int fv,fu;
fv=getf(v);
fu=getf(u);
if( fv==fu )
return 0;
else
{
f[fu]=fv;
return 1;
}
}
int kurall(int n, int m){
int i,cn=0;
for( i=1; i<=n; ++i )
f[i]=i;
for( i=0; i<m; ++i )
{
if( Uion(rode[i].s,rode[i].e) )
cn++;
if( cn == n-1 )// n-1 条边构成最小生成树
{
return rode[i].w; // 输出最小生成树中最长的一条边
}
}
}
int main(){
int n,m,i;
while( ~scanf("%d%d",&n,&m))
{
for( i=0; i<m; ++i )
scanf("%d%d%d",&rode[i].s,&rode[i].e,&rode[i].w);
sort(rode,rode+m,bigger());// 根据路径的长度来排序
int ans=kurall(n,m); //Kruskal算法
printf("%d\n",ans);
}
return 0;
}
POJ - 2395
最新推荐文章于 2018-09-16 19:57:00 发布