Rank of Tetris

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12344    Accepted Submission(s): 3497

Problem Description
自从Lele开发了Rating系统,他的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
 
Author
linle
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  1558 1879 1863 1875 1823 
 
分析:
如果直接拓扑的话,等号的情况很麻烦
一.采用并查集处理=号的情况
把具有等号关系的点聚合成为一个连通分量,且只用该连通分量的根结点替代分量中的所有点
比如A=B=C=D
以后A,B,C,D这四个点就只用A来表示
 
需要注意的地方:
1.必须先处理完所有的等号之后再进行拓扑排序(最后才想到!!!)
2.因为存在等号,我们有把等号处理了,所有我们可以拓扑的点可能不是n个了,而是根结点的个数个
 
2.采用拓扑排序处理>和<的情况
 
ps:
冲突情况:存在环,也就是进入队列的点不等于可以拓扑的点
信息不完全:某时刻队列里面元素个数大于1个,说明图不是连通图
 
 
必须先处理完所有等号的情况才能进行拓扑!!!
wa好多次
 
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
int mon1[]= {,,,,,,,,,,,,};
int mon2[]= {,,,,,,,,,,,,};
int dir[][]= {{,},{,-},{,},{-,}}; int getval()
{
int ret();
char c;
while((c=getchar())==' '||c=='\n'||c=='\r');
ret=c-'';
while((c=getchar())!=' '&&c!='\n'&&c!='\r')
ret=ret*+c-'';
return ret;
} #define max_v 20005
int pa[max_v];
int rk[max_v];
int indgree[max_v];
int a[max_v],b[max_v];
char o[max_v];
queue<int> q;
vector<int> vv[max_v];
int n,m,cnt;
int fa_num;
void init()
{
for(int i=; i<=n; i++)
pa[i]=i,rk[i]=;
memset(indgree,,sizeof(indgree));
while(!q.empty())
q.pop();
for(int i=; i<=n; i++)
vv[i].clear();
fa_num=;
cnt=;
}
int find_set(int x)
{
if(x!=pa[x])
pa[x]=find_set(pa[x]);
return pa[x];
}
void union_set(int x,int y)
{
x=find_set(x);
y=find_set(y);
if(x==y)
return ;
if(rk[x]>rk[y])
pa[y]=x;
else
{
pa[x]=y;
if(rk[x]==rk[y])
rk[y]++;
}
}
int tpsort()
{
for(int i=; i<=n; i++)
{
if(find_set(i)==i)//拓扑点必须是根结点
{
fa_num++;//计数 根结点
if(indgree[i]==)
q.push(i);
}
}
int temp;
int flag=;
while(!q.empty())
{
if(q.size()>)
flag=;//信息不完全
temp=q.front();
q.pop();
cnt++; for(int i=; i<vv[temp].size(); i++)
{
indgree[find_set(vv[temp][i])]--;
if(indgree[find_set(vv[temp][i])]==)
q.push(find_set(vv[temp][i]));
}
}
if(flag)//不能全拓扑(整个图不是连通的)
return ;
else
return ;
}
int main()
{
int x,y;
char c;
while(~scanf("%d %d",&n,&m))
{
if(n==&&m==)
{
printf("OK\n");
continue;
}
init();
int flag1=;//冲突 1
int flag2=;//信息不完全 1
for(int i=; i<=m; i++)//必须先合并除去=号,不能边除去边拓扑!!!
{
getchar();
scanf("%d %c %d",&a[i],&c,&b[i]);
a[i]++,b[i]++;
o[i]=c;
if(c=='=')
{
union_set(a[i],b[i]);
}
}
for(int i=;i<=m;i++)
{
if(o[i]=='=')
continue;
x=find_set(a[i]);
y=find_set(b[i]);
if(o[i]!='='&&find_set(x)==find_set(y))
{
flag1=;
continue;
}
if(o[i]=='<')
{
int temp=x;
x=y;
y=temp;
}
if(count(vv[y].begin(),vv[y].end(),x)!=)//环的一种情况
{
flag1=;
}
if(count(vv[x].begin(),vv[x].end(),y)==)//预防重边
{
vv[x].push_back(y);
indgree[y]++;
}
}
flag2=tpsort();
if(cnt!=fa_num)//不能全排列拓扑,因为信息不全
flag1=;
if(flag1==&&flag2==)
{
printf("OK\n");
}
else if(flag1==&&flag2==)
{
printf("CONFLICT\n");
}
else if(flag2==&&flag1==)
{
printf("UNCERTAIN\n");
}
else if(flag1==&&flag2==)
{
printf("CONFLICT\n");
}
}
return ;
}
 
 

HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)的更多相关文章

  1. hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. hdu1811 Rank of Tetris 并查集+拓扑排序

    #include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...

  3. hdu 1811Rank of Tetris (并查集 + 拓扑排序)

    /* 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B ...

  4. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  5. HDU 1811:Rank of Tetris(并查集+拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

  6. 并查集+拓扑排序 赛码 1009 Exploration

    题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...

  7. hdu 1811 Rank of Tetris - 拓扑排序 - 并查集

    自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...

  8. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. HDU 1811 Rank of Tetris 拓补排序+并查集

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [ ...

随机推荐

  1. POJ3436(KB11-A 最大流)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8133   Accepted: 2 ...

  2. HDU3534(SummerTrainingDay13-C tree dp)

    Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. Sql Server分页储存过程

    --分页储存过程if exists (select * from sys.procedures where name='Page')drop proc Pagegocreate proc Page@P ...

  4. PHP 类文件的自动加载机制 __autoload()

    如果一个类在多个脚本中都需要使用,可以将一个类的定义代码,单独的封装到一个文件中,这种文件也叫作类文件,在需要的时候,将整个文件载入进来即可! PHP在执行的时候,如果发现需要一个类(只要是和这个类相 ...

  5. js-权威指南-Web套接字

    HTTP是一种无状态的协议,,由客户端请求和服务端响应组成.HTTP实际上是比较特殊的网络协议. 大多数基于因特网的网络连接通常包含长连接和基于TCP套接字的双向消息交换.让不信任的客户端脚本访问底层 ...

  6. 通过sql的DMV查看数据库使用状态

    --数据库隔离级别 读未提交 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; --查找每次执行时引发I/O最多的前10位的查询 total_logi ...

  7. css BFC布局及用处

    http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html 这篇文章讲的很简单很实用

  8. Android Application中的Context和Activity中的Context的异同

    一.Context是什么: 1.Context是维持Android程序中各组件能够正常工作的一个核心功能类,我们选中Context类 ,按下快捷键F4,右边就会出现一个Context类的继承结构图啦, ...

  9. Visual Studio 2012 Update 1 离线升级包(相当于VS2012 SP1离线补丁包)

    Visual Studio 2012 Update 1 发布也有一段时间了,吾乐吧尝试了好几次在线升级,但是网络不给力啊,结果都失败了.于是一直都想找到官方提供的VS2012 SP1完整离线升级包,不 ...

  10. jsp 发布war 包到Tomcat

    1.将项目打包成war,打包过程这里不做赘述 2.在linux或者windows下安装xmapp 3.打开Tomcat下conf/server.xml,在host下添加一行        <Co ...