程序自动分析

题目链接:https://www.luogu.com.cn/problem/P1955

题意:

给定一系列相等以及不等关系,判断是否能够成立

思路:

由于不等式没有传递性,即a不等于b,b不等于c,无法满足a不等于c
也无法满足a等于c

因此需要先计算相等关系,再判断不等关系是否成立

离散化时如果用map需要放在全局变量防止RE,solve里也要调用clear方法清空

int f[maxn];

int find(int x){
	if(f[x]!=x){
		f[x]=find(f[x]);
	}
	return f[x];
}

void merge(int x,int y){
	if(find(x)!=find(y)){
		f[find(x)]=find(y);
	}
}
map<int,int>mp;

void solve(){
	int n;cin>>n;
	int cnt=1;
	for(int i=1;i<=2*n;i++)f[i]=i;
	mp.clear();
	vector<pii>x;
	for(int i=1;i<=n;i++){
		int a,b,c;cin>>a>>b>>c;
		if(mp[a]==0)mp[a]=cnt++;
		if(mp[b]==0)mp[b]=cnt++;
		
		if(c==1){
			merge(mp[a],mp[b]);
		}else{
			x.pb({mp[a],mp[b]});
		}
	}
	for(int i=0;i<x.size();i++){
		int a=x[i].fi,b=x[i].se;
		if(find(a)==find(b)){
			cout<<"NO"<<endl;
			return;
		}
	}
	
	cout<<"YES"<<endl;
}
posted @ 2025-03-30 16:17  Marinaco  阅读(21)  评论(0)    收藏  举报
//雪花飘落效果