C128 並查集+離散化 P1955 [NOI2015] 程式自動分析

董晓發表於2024-05-27

影片連結:

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");
  }
}

相關文章