Link
Solve
看并查集时看到一道不是很难的题
显然用并查集来统计联通块,查看是否合法
这道题的数据已经达到(10^9)所以要离散化一下
Code
#include<bits/stdc++.h>
using namespace std;
int t,n,x,y,e,fa[200005],flag,cnt;
vector<pair<int,int> >vec;
map<int,int>Map;
void init(){
for(int i=1;i<=2*n;++i)fa[i]=i;
}
int fd(int x){
return fa[x]==x?x:fa[x]=fd(fa[x]);
}
bool in_one(int x,int y){
return fd(x)==fd(y);
}
void U(int x,int y){
fa[fd(x)]=fd(y);
}
int main(){
ios::sync_with_stdio(0);
cin>>t;
while(t--){
Map.clear();
cnt=0;
cin>>n;
vec.clear();
init();
flag=0;
for(int i=1;i<=n;++i){
cin>>x>>y>>e;
if(Map.find(x)!=Map.end())x=Map[x];
else {Map[x]=++cnt;x=cnt;}
if(Map.find(y)!=Map.end())y=Map[y];
else {Map[y]=++cnt;y=cnt;}
if(e){
U(x,y);
}else{
vec.push_back(make_pair(x,y));
}
}
for(vector<pair<int,int> >::iterator it=vec.begin();it!=vec.end();++it){
if(in_one(it->first,it->second)){
cout<<"NO"<<endl;
flag=1;
break;
}
}
if(!flag)cout<<"YES"<<endl;
}
return 0;
}