最小生成树
双向建边,快排,二分答案,判断是否可行
code:
/ Forever_LF
**************************************************************
Problem: 1083
Language: C++
Result: Accepted
Time:32 ms
Memory:4400 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int x,y,c,next;
}a[200000]; int len,first[400];
int n,m,ans,num,l,r,mid;
int fa[400];
bool cmp( node x,node y ){return x.c<y.c;}
int find_fa( int x )
{
if( fa[x] == x )return x;
fa[x] = find_fa( fa[x] );
return fa[x];
}
bool judgement( )
{
int i; num = 0;
for( i=1;i<=n;i++ ) fa[i] = i;
for( i=1;i<=m;i++ )
if( a[i].c <= a[mid].c )
fa[ find_fa( a[i].x ) ] = fa[ find_fa( a[i].y ) ];
fa[1] = find_fa(1);
for( i=2;i<=n;i++ )
if( fa[1] != find_fa( i ) ) return false;
return true;
}
void ex( )
{
l=1; r=m;
while( l<=r )
{
mid = (l+r)/2;
if( judgement( ) ) r = mid-1;
else l = mid+1;
}
ans = r+1;
return ;
}
int main()
{
memset( first,0,sizeof first );
int i,j,x,y,c; len = 0;
scanf( "%d%d",&n,&m );
for( i=1;i<=m;i++ )
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);
sort( a+1,a+1+m,cmp );
ex( );
printf( "%d %d\n",n-1,a[ans].c );
return 0;
}