HDU 1811

http://acm.hdu.edu.cn/showproblem.php?pid=1811

题意: 题面意思

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#define maxs 101010
#include <vector>
#define MME(i,j) memset(i,j,sizeof(i))
using namespace std;
int fa[maxs],ranks[maxs],x[maxs],y[maxs];
vector <int> group[10005];
int son[maxs];

void init(int n)
{
    for(int i=0;i<=n;i++)
    {
        fa[i]=i,ranks[i]=0;
        group[i].clear();
    }
    MME(son,0);
}

int find_fa(int x)
{
    if(x==fa[x])
        return x;
    return fa[x]=find_fa(fa[x]);
}

bool joint(int x,int y)
{
    int a=find_fa(x),b=find_fa(y);
    if(a==b)
        return 0;
    if(ranks[a]>ranks[b])
        fa[b]=a;
    else{
        if(ranks[a]==ranks[b])
            ranks[b]++;
        fa[a]=b;
    }
    return 1;
}

char s[20000];

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        init(n);
        int cnt=n;
        for(int i=0;i<m;i++)
        {
            scanf("%d %c %d",&x[i],&s[i],&y[i]);
            if(s[i]=='=')
            {
                if(joint(x[i],y[i]))
                    cnt--;
            }
        }

        int rx,ry;

        for(int i=0;i<m;i++)
        {
            if(s[i]!='=')
            {
                rx=find_fa(x[i]),ry=find_fa(y[i]);
                if(s[i]=='>')
                {
                    group[rx].push_back(ry);
                    son[ry]++;
                }
                else{
                    group[ry].push_back(rx);
                    son[rx]++;
                }
            }
        }

        queue<int>q;
        for(int i=0;i<n;i++){
            if(son[i]==0 && i==find_fa(i))
                q.push(i);
        }
        bool fg=0;
        while(!q.empty())
        {
            if(q.size()>1) fg=1;
            int t=q.front();
            q.pop();
            cnt--;
            int sz=group[t].size();
            for(int i=0;i<sz;i++)
            {
                if(--son[group[t][i]]==0)
                    q.push(group[t][i]);
            }
        }
        if(cnt>0)
            printf("CONFLICT\n");
        else if(fg)
            printf("UNCERTAIN\n");
        else
            printf("OK\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值