hdu1811

链接:hdu1811

Description

  • 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。
  • 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还
  • 响。关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按这几个人的RP从高到低来排。
  • 终于,Lele要开始行动了,对N个人进行排名。为了方便起见,每个人都已经被编号,分别从0到N-1,并且编号越大,RP就越高。
  • 同时Lele从狗仔队里取得一些(M个)关于Rating的信息。这些信息可能有三种情况,分别是”A > B”,”A = B”,”A < B”,分别表示A的
  • Rating高于B,等于B,小于B。
  • 现在Lele并不是让你来帮他制作这个高手榜,他只是想知道,根据这些信息是否能够确定出这个高手榜,是的话就输出”OK”。否则就请你
  • 判断出错的原因,到底是因为信息不完全(输出”UNCERTAIN”),还是因为这些信息中包含冲突(输出”CONFLICT”)。
  • 注意,如果信息中同时包含冲突且信息不完全,就输出”CONFLICT”。

    Input

  • 本题目包含多组测试,请处理到文件结束。
  • 每组测试第一行包含两个整数N,M(0<=N<=10000,0<=M<=20000),分别表示要排名的人数以及得到的关系数。
  • 接下来有M行,分别表示这些关系

    Output

  • 对于每组测试,在一行里按题目要求输出

    Sample Input

    3 3
    0 > 1
    1 < 2
    0 > 2
    4 4
    1 = 2
    1 > 3
    2 > 0
    0 > 1
    3 3
    1 > 0
    1 > 2
    2 < 1

    Sample Output

    OK
    CONFLICT
    UNCERTAIN

    题解

  • 等于的话放在同一个集合,然后对集合建图。
  • 入度等于0的点多于1个说明信息不完整
  • 有环说明冲突
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#define rep(i,x,y) for(register int i=x;i<=y;++i)
#define repd(i,x,y) for(register int i=x;i>=y;--i)
#define ll long long
using namespace std;
const int N=1e5;
struct node{
int v,nxt;
inline void init(int a,int b){v=a; nxt=b;}
}e[N];
struct nd{
int a,b;
char c;
}mes[N];
int head[N],n,m,f[N],cnt,in[N],flag,sum;
queue<int> q;
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
inline int un(int x,int y){x=find(x); y=find(y); f[x]=y; return x!=y;}
inline void add(int a,int b){
e[cnt].init(b,head[a]);
head[a]=cnt++;
}
int top(){
rep(i,0,n-1)if(!in[i]&&find(i)==i)q.push(i);
while(!q.empty()){
if(q.size()>1)flag=1;
int u=q.front();
q.pop();sum--;
for(int i=head[u];i!=-1;i=e[i].nxt){
int t=e[i].v;
in[t]--;
if(in[t]==0)q.push(t);
}
}
}

int main(){
ios::sync_with_stdio(false);
while(cin>>n>>m){
flag=0;sum=n;
cnt=0;
rep(i,0,n)f[i]=i;
memset(in,0,sizeof(in));
memset(head,-1,sizeof(head));
rep(i,1,m){
cin>>mes[i].a>>mes[i].c>>mes[i].b;
if(mes[i].c=='='){if(un(mes[i].a,mes[i].b))sum--;}
}
rep(i,1,m)if(mes[i].c!='='){
int a=find(mes[i].a);
int b=find(mes[i].b);
if(mes[i].c=='>'){add(a,b);in[b]++;}
else {add(b,a); in[a]++;}
}
top();
if(sum>0)cout<<"CONFLICT"<<endl;
else if(flag)cout<<"UNCERTAIN"<<endl;
else cout<<"OK"<<endl;
}
return 0;
}