hdu 1811 Rank of Tetris (并查集+拓扑排序)
Rank of Tetris
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5415 Accepted Submission(s): 1514
为了更好的符合那些爱好者的喜好,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"。
每组测试第一行包含两个整数N,M(0<=N<=10000,0<=M<=20000),分别表示要排名的人数以及得到的关系数。
接下来有M行,分别表示这些关系
CONFLICT
UNCERTAIN
//#define LOCAL
#include<cstdio>
#include<cstring>
#include<vector>
#include<iterator>
#include<queue>
#include<functional>
using namespace std; const int maxn=;
const int nn=; struct path{ int fr,to;
char ss[];
}tt[maxn]; vector<int>aa[nn]; //模拟邻接表
int n,m,num;
int father[nn];
int inde[nn]; //入度 void init(){
for(int i=;i<n;i++)
father[i]=i;
} int fin(int x){
while(x!=father[x])
x=father[x];
return x;
} void unin(int a,int b){
father[b]=a;
} int main()
{
#ifdef LOCAL
freopen("test.in","r",stdin);
#endif while(scanf("%d%d",&n,&m)!=EOF){
init();
num=n;
for(int i=;i<m;i++){
scanf("%d%s%d",&tt[i].fr,tt[i].ss,&tt[i].to);
if(tt[i].ss[]=='='){
int x=fin(tt[i].fr);
int y=fin(tt[i].to);
if(x!=y){
unin(x,y);
num--;
}
}
} bool err=,fight=;
memset(inde,,sizeof(int)*(n+)); for(int i=;i<n;i++)
aa[i].clear(); for(int i=;i<m;i++)
{
if(tt[i].ss[]!='=')
{
int x=fin(tt[i].fr);
int y=fin(tt[i].to);
if(x==y){
err=; //有矛盾
break;
}
//构建拓扑图
if(tt[i].ss[]=='>'){
aa[x].push_back(y);
inde[y]++;
}
else{
aa[y].push_back(x);
inde[x]++; //记录入读的情况
}
}
} if(err){
printf("CONFLICT\n");
continue;
} queue<int>tuop;
//找出所有入度为0的点。
for(int i=;i<n;i++)
if(inde[i]==&&i==fin(i))
tuop.push(i); while(!tuop.empty()){
if(tuop.size()>){
fight=;
} int gt=tuop.front();
tuop.pop();
num--;
vector<int>::iterator ww;
for(ww=aa[gt].begin(); ww!=aa[gt].end();ww++){
inde[*ww]--;
if(inde[*ww]==)
tuop.push(*ww);
}
}
if(num>){ //成环
printf("CONFLICT\n");
continue;
}
if(!fight) printf("OK\n");
else printf("UNCERTAIN\n");
}
return ;
}
hdu 1811 Rank of Tetris (并查集+拓扑排序)的更多相关文章
- hdu1811 Rank of Tetris 并查集+拓扑排序
#include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...
- hdu 1811Rank of Tetris (并查集 + 拓扑排序)
/* 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B ...
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- HDU 1811:Rank of Tetris(并查集+拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系 ...
- 并查集+拓扑排序 赛码 1009 Exploration
题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...
- hdu 1811 Rank of Tetris - 拓扑排序 - 并查集
自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...
- HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 1811 Rank of Tetris 拓补排序+并查集
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) [ ...
- HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- Django 查询很经典的
版权归作者所有,任何形式转载请联系作者. 作者:petanne(来自豆瓣) 来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太N ...
- PE结构笔记
提示:前面加*为必须背下来的 DOS头: typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; //* Magic n ...
- servlet&jsp高级:第二部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 软/硬链接指令:ln
语法: ln [选项] 原文件 目标文件 选项: -s 创建软连接(创建软链接时,若所在文件夹不一致,原文件要使用绝对路径) 硬链接特征: 1.拥有相同i节点和存储block块,可以看成是同一个 ...
- poj 1066 线段相交
链接:http://poj.org/problem?id=1066 Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Subm ...
- python strip()函数
转发:jihite-博客园-python strip()函数 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的 ...
- python中的is、==和cmp()比较字符串
python 中的is.==和cmp(),比较字符串 经常写 shell 脚本知道,字符串判断可以用 =,!= 数字的判断是 -eq,-ne 等,但是 Python 确不是这样子地.所以作为慢慢要转换 ...
- Android简单登陆页面
布局: 线性布局+相对布局 日志打印: 利用LogCat和System.out.println打印观察. Onclick事件是采用过的第四种: 在配置文件中给Button添加点击时间 涉及知识: 通过 ...
- mysql概要(十三)备份和恢复
1.采用mysql 自带备份命令: 数据库恢复:
- [转载] 一些非常好的 linux 基础工具
http://linuxtools-rst.readthedocs.org/zh_CN/latest/index.html 作者整理的非常好, 需要的时候可以拿来参考