Rank of 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 杭电 拓扑排序加并查集的更多相关文章
- ACM1811拓扑排序和并查集
/* ACM1811 可以利用拓扑排序和并查集解决,主要方式是利用并查集在输入数据的时候将所有相等的点合并 然后将处理完的数据统一按照一个符号方向连接成有向线段,利用的是邻接矩阵:接下来把每条边都进行 ...
- 杭电 5326 Work (并查集求子结点为k的结点数)
Description It’s an interesting experience to move from ICPC to work, end my college life and start ...
- 杭电 4707 pet(并查集求元素大于k的集合)
Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He searche ...
- ZOJ 3521 Fairy Wars oj错误题目,计算几何,尺取法,排序二叉树,并查集 难度:2
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3521 ATTENTION:如果用long long 减小误差,这道题只能用 ...
- 杭电--1862--EXCEL排序--结构体排序
EXCEL排序 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 近几年杭电OJ大型比赛题目合集【更新到2017年11月初】
2017年: 区域赛网络赛 6194~6205 6206~6216 区域赛网络赛 6217~6229 2016年: 区域赛网络赛 5868~5877 5878~5891 5 ...
- P2256 一中校运会之百米跑(map映射加并查集)
真心水,也许只有我这样的蒟蒻能做这种题了吧.用STL中的map将所有人的名字映射成一个数字,然后就是并查集的裸题 #include<bits/stdc++.h> using namespa ...
- Luogu1155 NOIP2008双栈排序(并查集)
两个位置i和j上的元素不能被放进同一个栈的充要条件显然是存在k使i<j<k且ak<ai<aj.由此在保证合法的情况下贪心地放就是正确的了. 至于如何判断,可以记一下后缀最小值, ...
- hdu1811 Rank of Tetris 拓扑排序+并查集
这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...
随机推荐
- BookStore示例项目---菜单栏UI分析
部署 参照 ABP示例项目BookStore搭建部署 项目解构 1).动态脚本代理 启动项目时,默认会调用两个接口 /Abp/ApplicationConfigurationScript /Abp/S ...
- 图-搜索-DFS-51. N皇后
2020-03-15 19:49:59 问题描述: n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n ...
- 为什么你的程序配了classpath还是找不到类
classpath简介 classpath是java程序时拥有的一个系统变量,这个变量可以通过如下方式获取 System.out.println(System.getProperty("ja ...
- PYTHON数据类型(进阶)
PYTHON数据类型(进阶) 一.字符串.列表.字典.元祖.集合的补充 str #captalize 首字母大写,其余小写 s1.capitalize() #swapcase 大小写翻转 s1.swa ...
- ES6全面讲解
写在之前.讲解了比较常用的ES6知识点,可以快速的入门.有两个比较复杂的知识点(promise,generator)则是留在了其他文章中,在里面详细讲解. 介绍 1.历史 1.ECMAScript ...
- sql MariaDB 安装contos
安装和运行MySQL数据库(MariaDB) centos 平台 1.安装和运行 yum install mariadb mariadb-server - 安装 systemctl start mar ...
- Prism 源码解读7-导航
介绍 Prism提供了一个非常强大的功能导航,导航的意思就是指定对应的View显示.这个导航的强大之处有: 可以设置导航前后的动作 可以指定View实例的生命周期,可以是否导航到新的View实例 提供 ...
- 403 Invalid CORS request 跨域问题
5.跨域问题 跨域:浏览器对于javascript的同源策略的限制 . 以下情况都属于跨域: 跨域原因说明 示例 域名不同 www.jd.com 与 www.taobao.com 域名相同,端口不同 ...
- 封装一个通用的PopupWindow
上篇文章是关于建造者设计模式的,今天顺便封装一个通用的 PopupWindow 来实践一下, 同时也方便以后使用 PopupWindow,本文将从下面几个方面来介绍 PopupWindow 及其封装, ...
- Let‘s play computer game(最短路 + dfs找出所有确定长度的最短路)
Let's play computer game Description xxxxxxxxx在疫情期间迷上了一款游戏,这个游戏一共有nnn个地点(编号为1--n1--n1--n),他每次从一个地点移动 ...