求调30pts
查看原帖
求调30pts
975726
C202301楼主2024/9/2 22:12

在HZOJ上100pts,这里30pts,只对了#1#8#9,求调玄关

#include<iostream>
#include<cstdio>
#include<vector>
#include<unordered_map>
using namespace std;
class unionSet{
public:
	unionSet(int n):fa(n+1){
		for(int i=0;i<=n;i++)fa[i]=i;
	}
	int find(int x){
		return fa[x]=(fa[x]==x?x:find(fa[x]));
	}
	void merge(int a,int b){
		if(find(a)!=find(b))
		fa[find(a)]=find(b);
		return;
	}
	vector<int> fa;
};
int main()
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		int n,cnt=0;
		scanf("%d",&n);
		unionSet u(2*n);
		unionSet v(2*n);
		bool flag=1;
		unordered_map<long long,int> m;
		for(int i=1;i<=n;i++){
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			if(a==b&&c==1)continue;
			if(m.find(a)!=m.end()) a=m[a];
			else m.insert(make_pair(a,cnt)),a=cnt,cnt++;
			if(m.find(b)!=m.end()) b=m[b];
			else m.insert(make_pair(b,cnt)),b=cnt,cnt++;
			if(c==0){
				if(u.find(a)==u.find(b)){
					flag=0;
					continue;
				}
				else
				v.merge(a,b);
			}
			else{
				if(v.find(a)==v.find(b)){
					flag=0;
					continue;
				}
				else
				u.merge(a,b);
			}
		}
		if(flag)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
2024/9/2 22:12
加载中...