影片連結:
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"); } }