社区讨论

救救孩子吧 必关

P1525[NOIP 2010 提高组] 关押罪犯参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mix95ssw
此快照首次捕获于
2025/12/08 22:34
3 个月前
此快照最后确认于
2025/12/11 21:00
3 个月前
查看原帖
一个比较新奇的做法。
通过异或和记录每个点的染色,判断是否同色。
60pts,WA on #2、#4、#9、#10。
CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
	int a,b,c;
}p[100010];
bool cmp(const node&x,const node&y)
{
	return x.c>y.c;
}
int fa[20010],siz[20010];
bool w[20010];
void find(int u)
{
	if(fa[u]!=u)
	{
		find(fa[u]);
		fa[u]=fa[fa[u]];
		w[u]^=w[fa[u]];
	}
}
bool unite(int u,int v)
{
	find(u);
	find(v);
	int f=fa[u],g=fa[v];
	if(f==g)
	{
		if(w[u]==w[v])return 0;
		return 1;
	}
	else
	{
		if(siz[f]<siz[g])swap(f,g);
		fa[g]=f;
		w[f]=w[u]^w[v];
		siz[f]+=siz[g];
		return 1;
	}
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)cin>>p[i].a>>p[i].b>>p[i].c;
	sort(p+1,p+m+1,cmp);
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
		siz[i]=1;
		w[i]=0;
	}
	for(int i=1;i<=m;i++)
	{
		if(!unite(p[i].a,p[i].b))
		{
			cout<<p[i].c;
			return 0;
		}
	}
	cout<<0;
	return 0;
}
求调,玄关。

回复

1 条回复,欢迎继续交流。

正在加载回复...