自从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
思路:先用并查集将相等的元素连接起来,当成一个元素处理,,然后在对每个元素的根节点用拓扑排序,如果说排序过程中队列中的元素个数不等于一,说明条件不足,如果不能成功拍出,说明发生矛盾
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int N=1E5+; int arr1[N];
int arr2[N];
char arr3[N];
int pre[N];
vector<int >ve[N];
int in[N]; int find(int x){
if(x==pre[x]) return x;
return pre[x]=find(pre[x]);
} int main(){
int n,m;
while(cin>>n>>m){
memset(in,,sizeof(in));
for(int i=;i<N;i++){
pre[i]=i;
ve[i].clear();
}
queue<int >que;
memset(arr1,,sizeof(arr1));
memset(arr2,,sizeof(arr2));
int n1=n;
for(int i=;i<=m;i++){
scanf("%d %c %d",&arr1[i],&arr3[i],&arr2[i]);
if(arr3[i]=='='){
int fx=find(arr1[i]);
int fy=find(arr2[i]);
if(fx!=fy){
pre[fx]=fy;
n1--;
}
}
} for(int i=;i<=m;i++){
if(arr3[i]=='=') continue; int fx=find(arr1[i]);
int fy=find(arr2[i]); // if(fx==fy){
// puts("CONFLICT");
// continue ;
// }
if(arr3[i]=='>'){
ve[fx].push_back(fy);
in[fy]++;
} else {
ve[fy].push_back(fx);
in[fx]++;
}
} for(int i=;i<n;i++){
if(in[i]== && find(i)==i){
que.push(i);
}
}
int sum=;
bool uncertain=false;
while(que.size()){
if(que.size()>) uncertain=true;
int xx=que.front();
que.pop();
sum++;
for(int i=;i<ve[xx].size();i++){
in[ve[xx][i]]--;
if(in[ve[xx][i]]==){
que.push(ve[xx][i]);
}
}
}
if(sum!=n1) puts("CONFLICT");
else if(uncertain) puts("UNCERTAIN");
else puts("OK");
}
return ;
}

Rank of Tetris 杭电 拓扑排序加并查集的更多相关文章

  1. ACM1811拓扑排序和并查集

    /* ACM1811 可以利用拓扑排序和并查集解决,主要方式是利用并查集在输入数据的时候将所有相等的点合并 然后将处理完的数据统一按照一个符号方向连接成有向线段,利用的是邻接矩阵:接下来把每条边都进行 ...

  2. 杭电 5326 Work (并查集求子结点为k的结点数)

    Description It’s an interesting experience to move from ICPC to work, end my college life and start ...

  3. 杭电 4707 pet(并查集求元素大于k的集合)

    Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He searche ...

  4. ZOJ 3521 Fairy Wars oj错误题目,计算几何,尺取法,排序二叉树,并查集 难度:2

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3521 ATTENTION:如果用long long 减小误差,这道题只能用 ...

  5. 杭电--1862--EXCEL排序--结构体排序

    EXCEL排序 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. 近几年杭电OJ大型比赛题目合集【更新到2017年11月初】

    2017年: 区域赛网络赛   6194~6205    6206~6216 区域赛网络赛   6217~6229 2016年: 区域赛网络赛  5868~5877    5878~5891    5 ...

  7. P2256 一中校运会之百米跑(map映射加并查集)

    真心水,也许只有我这样的蒟蒻能做这种题了吧.用STL中的map将所有人的名字映射成一个数字,然后就是并查集的裸题 #include<bits/stdc++.h> using namespa ...

  8. Luogu1155 NOIP2008双栈排序(并查集)

    两个位置i和j上的元素不能被放进同一个栈的充要条件显然是存在k使i<j<k且ak<ai<aj.由此在保证合法的情况下贪心地放就是正确的了. 至于如何判断,可以记一下后缀最小值, ...

  9. hdu1811 Rank of Tetris 拓扑排序+并查集

    这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...

随机推荐

  1. LeetCode45——从搜索算法推导到贪心

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列的第25篇文章,今天我们一起来看的是LeetCode的第45题,Jump Game II. 有同学后台留言问我说, ...

  2. jquery实现元素的显示和隐藏

    这个是指定表格列的隐藏的demo,其余的都大同小异了 $("#account-table tr").find($("#tcNum")).show();//sho ...

  3. 02 Python函数与模块

     • 函数是什么 print() input() format() list() lower() upper()  • 函数的定义 def 函数名(形参1,2,3)  函数体 return  • 函数 ...

  4. OpenCV-Python 霍夫圈变换 | 三十三

    学习目标 在本章中, 我们将学习使用霍夫变换来查找图像中的圆. 我们将看到以下函数:cv.HoughCircles() 理论 圆在数学上表示为(x−xcenter)2(y−ycenter)2=r2(x ...

  5. OpenCV-Python系列教程介绍

    写在前面的话 OpenCV是计算机视觉中经典的专用库,其支持多语言.跨平台,功能强大. OpenCV-Python为OpenCV提供了Python接口,使得使用者在Python中能够调用C/C ,在保 ...

  6. MNIST数据集介绍

    大多数示例使用手写数字的MNIST数据集[^1].该数据集包含60,000个用于训练的示例和10,000个用于测试的示例.这些数字已经过尺寸标准化并位于图像中心,图像是固定大小(28x28像素),其值 ...

  7. 知识图谱与机器学习|KG入门 -- Part2 建立知识图谱

    介绍 在本系列前面两篇文章中我一直在讨论Data Fabric,并给出了一些关于Data Fabric中的机器学习和深度学习的概念.并给出了我对Data Fabric的定义: Data Fabric是 ...

  8. centos7中安装mysql

    centos7中安装mysql网上已经很多资源了,我就不在赘述了.我这里只是记录下我安装的时候出现的一些问题. 原文:https://www.cnblogs.com/bigbrotherer/p/72 ...

  9. 使用 nodejs 对文件进行批量重命名

    0. 前言 从B站下载了一点视频,硕鼠自动将标题添加到了每个文件名的前面,导致文件名过长,不方面查看文件的具体内容. 虽然只有二十几个文件,但是手动删除前缀还是个不小的工作量,还有可能删除错误.考虑到 ...

  10. Error while processing transaction.java.lang.IllegalStateException: begin() called when transaction is OPEN!

    Spark Streaming从flume 中使用Poll拉取数据时,报如下错误: Error while processing transaction. java.lang.IllegalState ...