标签:个数 std bit space font return bool col int
# 题意
t组数据判断,n个数据,每组一个x,y,e,e=1表示x=y,e=0表示x≠y,问是否存在矛盾
0<=n<=1e6
0<=x,y<=1e9
# 题解
因为x,y范围很大所以先将点离散化到小的范围内,然后先将x=y的所有合并到一个基本,再判断不相等的情况如果在一个集合则存在矛盾,否则没有矛盾
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+10; 4 int fa[N]; 5 int n; 6 int cnt; 7 struct query{ 8 int x,y,e; 9 }q[N]; 10 unordered_map<int,int>h; 11 int find(int x){ 12 if(fa[x]!=x) fa[x]=find(fa[x]); 13 return fa[x]; 14 } 15 void merge(int a,int b){ 16 fa[find(a)]=find(b); 17 } 18 int get(int x){ 19 if(h[x] == 0) h[x] = ++cnt; 20 return h[x]; 21 } 22 void solve(){ 23 cin>>n; 24 cnt=0; 25 h.clear(); 26 for(int i=0;i<n;i++){ 27 int x,y,e; 28 cin>>x>>y>>e; 29 q[i]={get(x),get(y),e}; 30 } 31 for(int i=1;i<=cnt;i++) 32 fa[i]=i; 33 34 for(int i=0;i<n;i++){ 35 if(q[i].e==1){ 36 merge(q[i].x,q[i].y); 37 } 38 } 39 bool flag=0; 40 for(int i=0;i<n;i++){ 41 if(q[i].e==0) { 42 int fax = find(q[i].x), fay = find(q[i].y); 43 if (fax == fay) { 44 flag = 1; 45 break; 46 } 47 } 48 } 49 if(flag) 50 cout<<"NO"<<endl; 51 else 52 cout<<"YES"<<endl; 53 } 54 int main(){ 55 int t; 56 cin>>t; 57 while(t--){ 58 solve(); 59 } 60 }
标签:个数 std bit space font return bool col int
原文地址:https://www.cnblogs.com/hhyx/p/12442100.html