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
");
else printf("NO
");
}
}```