P1955 [NOI2015]程序自动分析 题解

Link

P1955 [NOI2015]程序自动分析

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;
}
原文地址:https://www.cnblogs.com/martian148/p/13875248.html