题目:http://www.luogu.org/problem/lists?name=&tag=37
分析:一开始二分图染色写错了,然后学会了并查集做法。
有这样一个事实:a不与b同集合,c不与b同集合,则a一定与c同集合。
于是从小打到排序边,第一个不满足要求的即为所求。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int Tmax=20005,Tmax2=100005;
struct edge{
int u,v,w;
bool operator <(const edge &rhs)const
{
return w>rhs.w;
}
};
edge G[Tmax2];
int n,m,f[Tmax*2];
int find(int x)
{
return f[x]=f[x]==x?x:find(f[x]);
}
void work()
{
int i,x,y,xx,yy;
for(i=1;i<=2*n;i++)
f[i]=i;
for(i=1;i<=m;i++)
{
x=find(G[i].u);
y=find(G[i].v);
if(x==y)
{
printf("%d",G[i].w);
return;
}
xx=find(G[i].u+n);
yy=find(G[i].v+n);
f[x]=yy;
f[y]=xx;
}
printf("0");
return;
}
int main()
{
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d%d%d",&G[i].u,&G[i].v,&G[i].w);
sort(G+1,G+1+m);
work();
return 0;
}