rt,思路同第一篇题解,使用带权并查集来实现,但只有10pts。
以下是本菜鸡的代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define fi first
#define se second.first
#define th second.second
using namespace std;
const int MAXN=1e5+10;
pair<int,pair<int,int> > a[MAXN];
static int fa[MAXN],d[MAXN];
int n,m,ans;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
int find(int x)
{
if(fa[x]==x)return x;
int rt=find(fa[x]);
d[x]=d[x]+d[rt]&1;
return fa[x]=rt;
}
int find(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx^fy)return -1;
return d[x]+d[y]&1;
}
void merge(int x,int y,int w)
{
int fx=find(x),fy=find(y);
if(fx^fy)
fa[fx]=fy,d[fx]=w-d[x]-d[y]&1;
}
signed main()
{
n=read();m=read();
for(int i=1;i<=m;i++)
a[i].se=read(),a[i].th=read(),a[i].fi=read();
stable_sort(a+1,a+n+1);
int x,y;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=m;i;i--)
{
x=find(a[i].se,a[i].th);
if(x==0){printf("%lld",a[i].fi);return 0;}
if(x==-1)merge(a[i].se,a[i].th,1);
}
puts("0");
return 0;
}