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 ...
随机推荐
- VMware ESXI5.0的安装配置 zz
http://www.hotxf.com/thread-297-1-1.html 1, Vmware ESXI 光盘一张文件大小290M,本教程是以 5.0为案例. 2, 所需要安装的操作 ...
- DirectX 矩阵
基础: 下标:第一个下标为该元素所在行的索引,第二个下标为该元素所在列的索引.如下图所示 行向量和列向量:只有单行的向量称为行向量,只有单列的称之为列向量. 相等 维数和元素都相等 数乘(与标量相乘) ...
- 【转载】Ogre的内存分配策略
原文:Ogre的内存分配策略 读这个之前,强烈建议看一下Alexandrescu的modern c++的第一章关于policy技术的解释.应该是这哥们发明的,这里只是使用. 首先列出涉及到的头文件:( ...
- Oracle同义词学习
oracle的同义词总结 从字面上理解就是别名的意思,和视图的功能类似.就是一种映射关系. 同义词拥有如下好处: 节省大量的数据库空间,对不同用户的操作同一张表没有多少差别; 扩展的数 ...
- CUBRID学习笔记 33 net事务 cubrid教程示例
conn.BeginTransaction(); string sql = "create table t(idx integer)"; using (CUBRIDCommand ...
- factory工厂模式之工厂方法FactoryMethod
工厂方法(Factory Method) * 工厂方法把不同的产品放在实现了工厂接口的不同工厂类(FactoryAImpl,FactoryBImpl...)里面, * 这样就算其中一个工厂类出了问题, ...
- Github上不错的Android开源代码(一)
总有一些朋友很热心的整理一些好的资料,在收集之后,可以用作阅读.学习和实践.小伙伴们,总有一天,你也能写出 Niubility 的 Android App :-) 为了防止以上链接失效,以及部分内容丢 ...
- iOS - OC NSCache 缓存
前言 NSCache 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本.用法与 NSMutableDictio ...
- [转载] 根据多年经验整理的《互联网MySQL开发规范》
原文: http://weibo.com/p/2304181380b3f180102vsg5 根据多年经验整理的<互联网MySQL开发规范> 写在前面:无规矩不成方圆.对于刚加入互联网的朋 ...
- 1503 - A PRIMARY KEY must include all columns in the table's partitioning function
1503 - A PRIMARY KEY must include all columns in the table's partitioning function 错误的原因:表的主键字段必须包含分 ...