求条
查看原帖
求条
1375749
Green_Leaves楼主2024/10/20 11:24

用的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
*/
2024/10/20 11:24
加载中...