AcWing 237 并查集+离散化

https://www.acwing.com/problem/content/239/
并查集思路很平常,本题的坑点是数据范围很大,要先进行离散化。其中对于本题在离散化时不用保存原序列的大小,只需要保持一一对应即可,故用unordered_map进行离散化。

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N=2000010;
int n,m;
int p[N];
unordered_map<int,int> S;
struct Query
{
	int x,y,e;
}query[N];
int get(int x)
{
	if(S.count(x)==0) S[x]=++n;
	return S[x];
}
int find(int x)
{
	if(p[x]!=x) p[x]=find(p[x]);
	return p[x];
}
void merge(int x,int y)
{
	p[find(x)]=find(y);
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		n=0;
		S.clear();
		scanf("%d",&m);
		for(int i=1;i<=m;i++)
		{
			int x,y,e;
			scanf("%d%d%d",&x,&y,&e);
			query[i]={get(x),get(y),e};
		}
		
		for(int i=1;i<=n;i++) p[i]=i;
		
		for(int i=1;i<=m;i++)//合并所有相等条件 
			if(query[i].e==1)
			merge(query[i].x,query[i].y);
			
		int flag=1;
		for(int i=1;i<=m;i++)
		{
			if(query[i].e==0)
			{			
				if(find(query[i].x)==find(query[i].y))
				{
					flag=0;
					break;
				}
			}
		}
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
}```
posted @ 2020-08-09 14:26  地球长大的赛亚人  阅读(70)  评论(0编辑  收藏  举报