NOI2015 程序自动分析

题目链接:戳我

就是并查集水题.


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define MAXN 1000010
using namespace std;
int n,T,cnt;
int fa[MAXN];
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
map<int,int>id;
struct Line{int x,y,op;}line[MAXN];
inline bool cmp(struct Line a,struct Line b){return a.op>b.op;}
inline bool check()
{
    for(int i=1;i<=n;i++)
    {
        int x=id[line[i].x],y=id[line[i].y];
        int a=find(x),b=find(y);
        // printf("x=%d y=%d a=%d b=%d op=%d\n",x,y,a,b,line[i].op);
        if(line[i].op==0)
        {
            if(a==b) return false;
        }
        else if(line[i].op==1)
        {
            if(a!=b) fa[a]=b;
        }
    }
    return true;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d",&T);
    while(T--)
    {
        cnt=0;
        id.clear();
        scanf("%d",&n);
        // printf("n=%d\n",n);
        for(int i=1;i<=n;i++)
        {
            int x,y;
            scanf("%d%d%d",&x,&y,&line[i].op);
            if(!id.count(x)) id[x]=++cnt;
            if(!id.count(y)) id[y]=++cnt;
            line[i].x=x,line[i].y=y;
        }
        sort(&line[1],&line[n+1],cmp);
        for(int i=1;i<=cnt;i++) fa[i]=i;
        // printf("cnt=%d\n",cnt);
        if(check()==true) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
posted @ 2019-05-30 07:16  风浔凌  阅读(100)  评论(0编辑  收藏  举报