HDU 1811 Rank of Tetris 拓补排序+并查集
Rank of Tetris
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
为了更好的符合那些爱好者的喜好,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"。
>
<
> =
>
>
> >
>
<
【Sample Output】
OK
CONFLICT
UNCERTAIN
【题意】
给定一些点对之间的关系(大于小于相等),判断是否发生冲突。
【分析】
对于冲突判断,直观的想法就是拓扑排序。以大于号或者小于号方向作为拓扑序的方向,如果处理时出现违反拓扑序列的情况则可判断为冲突。
然后这道题还有另外一个问题就是相等情况的处理,如果直接按照拓扑排序对其进行分析,则可能发生错误。为了解决这个问题,可以用并查集进行预处理,将所有相等的点缩成1个点,然后进行后序的拓扑排序。
#include<iostream>
#include<cstdio>
#include<algorithm> using namespace std; int father[]; void clean_father(int n)
{
for (int i=;i<n;i++) father[i]=i;
} int getfather(int x)
{
if (father[x]!=x) father[x]=getfather(father[x]);
return father[x];
} void link(int x,int y)
{
father[getfather(x)]=getfather(y);
} int x[],y[],rd[],num[],start[];
char z[]; typedef struct {
int a,b;
} node;
node a[]; bool op(node a,node b)
{
return a.a<b.a;
} int stack[]; int main()
{
int n,m;
while (scanf("%d%d",&n,&m)!=EOF)
{
clean_father(n); for (int i=;i<=m;i++)
{
scanf("%d %c %d",&x[i],&z[i],&y[i]);
if (z[i]=='=') link(x[i],y[i]);
} int tail=;
for (int i=;i<n;i++) rd[i]=-;
int tot=;
for (int i=;i<n;i++)
{
rd[getfather(i)]=;
if (rd[i]==) tot++;
}
for (int i=;i<=m;i++)
switch(z[i])
{
case '>':
tail++;
a[tail].a=getfather(x[i]);
a[tail].b=getfather(y[i]);
rd[getfather(y[i])]++;
break;
case '<':
tail++;
a[tail].a=getfather(y[i]);
a[tail].b=getfather(x[i]);
rd[getfather(x[i])]++;
}
sort(&a[],&a[tail+],op); int o=-;
for (int i=;i<n;i++) num[i]=;
for (int i=;i<=tail;i++)
{
if (a[i].a!=o)
{
o=a[i].a;
start[o]=i;
}
num[o]++;
} int top=;
for (int i=;i<n;i++)
if (rd[i]==)
{
top++;
stack[top]=i;
} if (top==)
{
printf("CONFLICT\n");
continue;
} bool flag=false,done=false;
while (top>&&(!done))
{
if (top>) flag=true;
int now=stack[top];
top--;tot--;
for (int i=;i<num[now];i++)
{
rd[a[start[now]+i].b]--;
if (rd[a[start[now]+i].b]==)
{
top++;
stack[top]=a[start[now]+i].b;
} else
if (rd[a[start[now]+i].b]<)
{
done=true;
break;
}
}
num[now]=;
}
if (tot>||done) printf("CONFLICT\n");
else if (flag) printf("UNCERTAIN\n");
else printf("OK\n");
} return ;
}
HDU 1811 Rank of Tetris 拓补排序+并查集的更多相关文章
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
题目链接: 传送门 Rank of Tetris Time Limit: 1000MS Memory Limit: 32768 K Description 自从Lele开发了Rating系统, ...
- HDU 1811 Rank of Tetris 【拓扑排序 + 并查集】
自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...
- hdu 1811 Rank of Tetris(拓扑,并查集)
题意:略 分析:排序先按rating,若相同,则按rp.考虑到每个人的rp均不同,所以rating相同的人必然可以排序.那么只需要考虑rating不同的集合了. 大小关系可以用有向边表示,而大小关系 ...
- HDU 1811 Rank of Tetris 【拓扑排序】+【并查集】
<题目链接> 题目大意: 给你N个点(编号从0到N-1)和M个关系,要你判断这个图的所有点的顺序是否可以全部确定.不过对于任意点的关系可能存在A>B或A<B或A=B三种情况,如 ...
- Rank of Tetris(hdu1811拓扑排序+并查集)
题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...
- 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 (拓扑 & 并查集)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 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 ...
随机推荐
- UIImageView 在切图规范的情况下不用设置frame
UIImageView本身是没有frame的,所以UIImageView不用设置frame,UIImageView的fram由它内部的图片决定,所以当要更改UIImageView的大小显示的时候,更改 ...
- maven source
accepted To download sources for your dependencies: mvn eclipse:eclipse -DdownloadSources=true To at ...
- Lua 基础 -- 学习笔记
标签(空格分隔): Lua 1. Lua可以一次性给多个变量赋值 变量比赋值多,多的变量就赋值nil 变量比赋值少,多的赋值舍弃 local a, b, c = 1, 2, 3 print( a, b ...
- js屏蔽浏览器右键菜单
<script type="text/javascript"> function doNothing(){ window.event.returnValue=false ...
- ios中点语法、property跟synthesize用法
一:OC中得点语法 1> 点语法的基本使用: ·使用 对象.成员变量 可以实现设置成员变量值,和获取成员变量的值 2> 点语法的本质 (点语法是Xcode编译器自己帮我们完成的一个 ...
- jsp环境搭建(Windows)
1.软件准备 JDK 最新版jdk-8u45-windows-x64.exe tomcat 最新版32-bit/64-bit Windows Service Installer Eclipse IDE ...
- Tomcat服务器
常见的web服务器 1. WebLogic是BEA公司的产品,是目前应用最广泛的web服务器,支持J2EE规范(J2EE里有13种技术),商业产品,收费的.银行,证券等对并发,安全要求高的时候用,一般 ...
- MySQ安装
1.去官网下载安装包 .http://www.mysql.com/downloads/ 2.安装过程中会出现下面的提示:记得保存你的MySQL的初始的默认密码.如果没有注意,那么恢复起来有点麻烦,后续 ...
- 【转载】newInstance()和new()
newInstance()和new() 在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法.通过查询Java Documentation我们会发现使用Class.fo ...
- OC 消息机制本质
转载自:http://m.blog.csdn.net/blog/util_c/10287909 在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段.编译器会将消 ...