用的LCA求距离判是否合法,用按秩合并只有log的查询,求条
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,fa[20005],siz[20005];
struct node{
int a,b,v;
bool operator>(const node& bb)const{
return v>bb.v;
}
}s[100005];
int find(int x){
if(fa[x])return find(fa[x]);
return x;
}
int anss[20005];
int len(int a,int b){
vector<int> canto;
int al=1,bl=1,re=-1;
while(a)anss[a]=(al++),canto.push_back(a),a=fa[a];
while(b){
if(anss[b]){
re=bl+anss[b];
break;
}
bl++;
b=fa[b];
}
for(int i:canto)anss[i]=0;
return re;
}
int main(){
ios::sync_with_stdio(0);
// freopen("prison.in","r",stdin);
// freopen("C:\\Users\\HP\\Downloads\\P1525_2.in","r",stdin);
// freopen("prison.out","w",stdout);
cin>>n>>m;
for(int i=0;i<m;i++)cin>>s[i].a>>s[i].b>>s[i].v;
for(int i=1;i<=n;i++)siz[i]=1;
sort(s,s+m,greater<node>());
for(int i=0;i<m;i++){
// cout<< s[i].a<<' '<<s[i].b<<' '<<s[i].v<<' '<<len(s[i].a,s[i].b)<<' '<<find(s[i].a)<<' '<<find(s[i].b)<<'\n';
if(find(s[i].a)==find(s[i].b)&&len(s[i].a,s[i].b)%2==0){
cout<<s[i].v;
return 0;
}
if(find(s[i].a)!=find(s[i].b)){
int fda=find(s[i].a),fdb=find(s[i].b);
if(siz[fdb]<siz[fda])swap(fda,fdb);
fa[fda]=find(fdb),siz[fdb]+=siz[fda];
}
}
cout<<0;
}
/*
4 4
1 2 100000
3 4 100000
1 3 2
2 4 1
*/