P1955 [NOI2015]程式自動分析 題解
阿新 • • 發佈:2020-10-25
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; }