带权并查集50pts求调
查看原帖
带权并查集50pts求调
473992
dbycs11楼主2025/2/7 20:35

rt,思路与第一篇题解相同,使用带权并查集实现,但只有50分。

#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+m+1);
	int x,y;
	for(int i=1;i<MAXN;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;
}
2025/2/7 20:35
加载中...