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 ...
随机推荐
- perl-cgi命令行调试
来源: http://www.cnblogs.com/itech/archive/2012/09/23/2698838.html 参考: http://docstore.mik.ua/orelly/l ...
- 32位Intel CPU所含有的寄存器
4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) ...
- 无线手柄+步进电机——控制方向
今天测试了一下无线手柄控制电机转向的改变 1: #include <PS2X_lib.h> //for v1.6 2: #include <Stepper.h> 3: 4: ...
- c++内存流
1.MemoryStream.h文件内容 ifndef _MEM_STREAM_H_ #define _MEM_STREAM_H_ #include <string> class CMem ...
- Android NDK and OpenCV Development With Android Studio
Android NDK and OpenCV Development With Android Studio Hujiawei 172 2014年10月22日 发布 推荐 0 推荐 收藏 4 收藏,5 ...
- Break on _NSLockError() to debug.
*** -[NSCondition dealloc]: condition (<NSCondition: 0x1039a450> '(null)') deallocated while s ...
- [转]解决LinearLayout中控件不能居右对齐
在LinearLayout布局时使用右对齐(android:layout_gravity="right")控件对齐方式不生效,需要设置 android:layout_weight= ...
- http协议--笔记
HTTP协议的缺点:1.通信使用明文(不加密),内容可能会被窃听2.不验证通信方的身份,因此有可能遭遇伪装3.无法证明报文的完整性,所以有可能已遭篡改 防止窃听保护信息的几种对策:加密技术通信的加密H ...
- HDU 5240 Exam
The 2015 ACM-ICPC China Shanghai Metropolitan Programming Contest 2015ACM-ICPC上海大都会赛 签到题 #include< ...
- 修改tomcat的get方法的参数长度
在solr查询中,遇到查询字符串过长,返回错误,在tomcat的conf/server.xml中修改下面的参数即可.加上maxHttpHeaderSize="65536" < ...