[HNOI2010]平面图判定(带权并查集)

该博客详细介绍了如何利用带权并查集解决HNOI2010中平面图的判定问题,强调了在处理相交线时的连边策略以及在实现过程中Find操作的注意事项。通过ACCode分享了通过验证的代码实现。
摘要由CSDN通过智能技术生成

将相交的线连边判断二分图即可。
注意带权并查集的 F i n d \rm{Find} Find不能随便用。

A C C o d e \rm{AC Code} ACCode

#include<bits/stdc++.h>
#define maxn 10005
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
using namespace std;

int n,m,x[maxn],y[maxn],d[maxn],pe[maxn],F[maxn],dis[maxn];
int Find(int u){
	if(!F[u]) return u;
	int f = F[u];
	F[u] = Find(F[u]);
	dis[u] ^= dis[f];
	return F[u];
}
int main(){
	int T;
	for(scanf("%d",&T);T--;){
		scanf("%d%d",&n,&m);
		memset(F,0,sizeof F),memset(dis,0,sizeof dis);
		for(int i=1;i<=m;i++){
			scanf("%d%d",&x[i],&y[i]);
			if(x[i] > y[i]) swap(x[i],y[i]);
		}
		for(int i=1;i<=n;i++) scanf("%d",&d[i]),pe[d[i]]=i;
		if(m > 3 * n - 6){ puts("NO");continue; }
		vector<int>p;
		for(int i=1;i<=m;i++){
			x[i] = pe[x[i]] , y[i] = pe[y[i]];
			if(x[i] > y[i]) swap(x[i],y[i]);
			if(y[i] != (x[i] % n + 1))
				p.pb(i);
		}
		int g = p.size();
		bool ERROR = 0;
		for(int i=0;i<g;i++)
			for(int j=0;j<g;j++)
				if(x[p[i]]<x[p[j]]&&x[p[j]]<y[p[i]]&&y[p[i]]<y[p[j]]){
					int a , b;
					if((a=Find(p[i])) != (b=Find(p[j]))){
						F[a] = b;
						dis[a] = dis[p[i]] ^ dis[p[j]] ^ 1;
					}
					else if(dis[p[i]] == dis[p[j]]) ERROR = 1;
				}
		if(ERROR) puts("NO");
		else puts("YES");
 	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值