C128 并查集+离散化 P1955 [NOI2015] 程序自动分析

视频链接:C128 并查集+离散化 P1955 [NOI2015] 程序自动分析_哔哩哔哩_bilibili

 

 

P1955 [NOI2015] 程序自动分析 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 并查集+离散化
#include <iostream>
#include <unordered_map>
using namespace std;

const int N=100005;
int T,n,cnt;
int a[N],b[N],e[N];
int p[N*2];
unordered_map<int,int> mp;

int get(int x){ //离散化
  if(mp.count(x)==0) mp[x]=++cnt;
  return mp[x];
}
int find(int x){
  return p[x]==x?x:p[x]=find(p[x]);
}
int main(){
  scanf("%d",&T);
  while(T--){
    cnt=0; mp.clear();
    scanf("%d",&n);
    for(int i=1;i<=n*2;i++) p[i]=i;
    for(int i=1;i<=n;i++){
      scanf("%d%d%d",&a[i],&b[i],&e[i]);
      a[i]=get(a[i]); b[i]=get(b[i]);
    }
    for(int i=1;i<=n;i++) //合并集合
      if(e[i]==1){
        int x=find(a[i]),y=find(b[i]);
        if(x!=y) p[x]=y;
      }
    bool flag=1;
    for(int i=1;i<=n;i++) //判断矛盾
      if(e[i]==0&&find(a[i])==find(b[i])){
        flag=0; break;
      }
    flag?puts("YES"):puts("NO");
  }
}

 

posted @ 2024-05-27 06:59  董晓  阅读(292)  评论(0)    收藏  举报