Problem 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 30 > 11 < 20 > 24 41 = 21 > 32 > 00 > 13 31 > 01 > 22 < 1
 
Sample Output

OKCONFLICTUNCERTAIN

思路:

其中一个难点就是对=的处理,虽然可以用RP转化为>、<但是,遇到连续的A=B=C...这样就要处理一连串的数据,很麻烦,所以这里用并查集将所有rating相等的转化为根(相等的肯定是可以排序的),然后再处理合并后点集,最后进行拓扑排序。

关于判断:

UNCERTAIN:如果压入队列的点大于一个,那么这两个点就无法比较大小,因为他们的rating不知道

CONFLICT:成环或者大于小于等于矛盾

注意看题目,当UNCERTAIN和CONFLICT都存在时,要输出CONFLICT,在这里WA了emmm

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<queue>
#include<cmath>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<iostream>
#include<algorithm>
#include<sstream>
#define ll long long
const int N=10005;
const int INF=1e9;
using namespace std;
int degree[N],pre[N],l[2*N],r[2*N],id[N],cnt;
char m[2*N];
int n,M;
vector<int> g[N*10];
int find(int x){
int i=x;
while(i!=pre[i]){
i=pre[i];
}
int r=x;
while(r!=pre[r]){
r=pre[r];
pre[r]=i;
}
return i;
} int topo(){ //0-conflict 1-uncertain
int point=cnt;
int uncertain=0;
priority_queue<int,vector<int>,less<int> >q ;
while(!q.empty()) q.pop();
for(int i=0;i<cnt;i++){
if(degree[id[i]]==0) q.push(id[i]);
}
int v;
while(!q.empty()){
if(q.size()>=2) uncertain=1; //这里不要直接return 1,如果既冲突又不确定要输出冲突
v=q.top();
q.pop();
point--;
for(int i=0;i<g[v].size();i++){
int e=g[v][i];
degree[find(e)]--;
if(degree[find(e)]==0) q.push(find(e));
}
}
if(point>1) return 0;
else if(uncertain==1) return 1;
else return 2;
}
int main(){
int a,b;
string c;
while(~scanf("%d%d",&n,&M)){
for(int i=0;i<N;i++){
pre[i]=i;
g[i].clear();
}
memset(degree,0,sizeof(degree));
for(int i=0;i<M;i++){
scanf("%d %c %d",&l[i],&m[i],&r[i]);
if(m[i]=='='){
int x=find(l[i]);
int y=find(r[i]);
if(x!=y){
pre[x]=y;
}
}
}
int conflict=0;
for(int i=0;i<M;i++){
if(m[i]=='=') continue;
int x=find(l[i]);
int y=find(r[i]);
if(x==y){
conflict=1;
break;
}
if(m[i]=='>'){
g[x].push_back(y); //x->y 表示 x>y
degree[y]++;
}
else if(m[i]=='<'){
g[y].push_back(x);
degree[x]++;
}
}
if(conflict){ //初步排查 >、< 与 = 的冲突
printf("CONFLICT\n");
continue;
}
cnt=0;
for(int i=0;i<n;i++){
if(pre[i]==i){
id[cnt++]=i; //合并后点集
}
}
int ans=topo();
if(ans==0) cout<<"CONFLICT"<<endl;
else if(ans==1) cout<<"UNCERTAIN"<<endl;
else cout<<"OK"<<endl;
}
return 0;
}

HDU 1811(并查集+拓扑排序)题解的更多相关文章

  1. HDU 1811:Rank of Tetris(并查集+拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

  2. 并查集+拓扑排序 赛码 1009 Exploration

    题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...

  3. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  4. HDU 1811 并查集+拓扑排序

    Rank of Tetris 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1811 Problem Description 自从Lele开发了Rati ...

  5. hdu 1811 Rank of Tetris - 拓扑排序 - 并查集

    自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...

  6. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. hdu 1811Rank of Tetris (并查集 + 拓扑排序)

    /* 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B ...

  8. HDU 5222 ——Exploration——————【并查集+拓扑排序判有向环】

    Exploration Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  9. HDU——1272小希的迷宫(并查集+拓扑排序)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

随机推荐

  1. elasticsearch数据转移,elasticdump的安装使用

    模拟: 将本地的my_index的products的一条document转移到http://192.168.111.130的一个es服务器上. (一)安装elasticdump 先安装node.js, ...

  2. CF750F New Year and Finding Roots 构造+树论

    正解:构造 解题报告: 传送门! 交互题交互题!哇好新鲜啊QwQ 首先考虑最傻逼的做法,应该是每个人都能想到的 首先看一下它给的条件,考虑到完全二叉树的性质,就可以发现,如果给的邻居只有一个,说明是叶 ...

  3. 解决SQL Server管理器无法连接远程数据库的问题(转)

    add by zhj: 本文最后那个数据库别名没搞明白,在我的测试中没有建别名,是可以的.远程登陆时,服务器名称: 服务器IP,端口号 (如223.42.155.248,52134 如果是默认端口号1 ...

  4. Why String is Immutable or Final in Java

    The string is Immutable in Java because String objects are cached in String pool. Since cached Strin ...

  5. AppFog使用

    cd ‘你的应用目录’ af login(之后输入你的邮箱和密码) af update ‘你的应用名’ 相关文档:https://docs.appfog.com/getting-started/af- ...

  6. What is Druid?

    Druid is a data store designed for high-performance slice-and-dice analytics ("OLAP"-style ...

  7. java项目连接jdbc报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server

    java项目连接jdbc报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not creat ...

  8. Spark中的Spark Shuffle详解

    Shuffle简介 Shuffle描述着数据从map task输出到reduce task输入的这段过程.shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过s ...

  9. Kettle定时抽取两个库中的两个表到目标库SYS_OPLOG表

     A库a表(红色为抽取字段): 关联用户表: B库b表(红色为抽取字段): 关联用户表  C目标库SYS_OPLOG表(c表) 利用kettle抽取A库a表(具体名称见上图),B库b表的上面红色框起来 ...

  10. POJ1860:Currency Exchange(BF)

    http://poj.org/problem?id=1860 Description Several currency exchange points are working in our city. ...