hdu 1811 Rank of Tetris

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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
/*/
中文题: 按照输入把给出的0~n-1排序,如果是'='按照大小排序,如果是'>'||'<'就按照符号排序; 一开始也是被题意给欺骗了,就是这个'=' ,以为'='号的话两边的排序就按照大小,然后WA了一发。 仔细思考之后发现,并不是这样的,例如 0 = 2 虽然按照排序是 2-0这样,但是这两个的值是相等的 也就是说,这两个数要绑定到一起,在去和其他的数进行排序,这下题意就很清晰了:拓扑排序+并查集+离线。 一开始把所有的'='连起来的点全部绑定起来,再用并查集和拓扑排序去排列,看是不是整个队列严格排序。 这个写起来就很快了。 我承认我犯傻,写到排序这里,本来应该去连接两个比较大小的队伍的根节点却忘了,搞得我重新写了几次真是【MDZZ】--真的只能剁手了、、、、 下面有两组AC代码,一组用了STL 一组没用,都是zz惹的祸; AC代码:
/*/
#include"algorithm"
#include"iostream"
#include"cstring"
#include"cstdlib"
#include"string"
#include"cstdio"
#include"vector"
#include"cmath"
#include"queue"
using namespace std;
#define memset(x,y) memset(x,y,sizeof(x))
#define memcpy(x,y) memcpy(x,y,sizeof(x))
#define MX 10005 // 拓扑排序 + 并查集 + STL //因为思路差不多,注释只打在了第一个代码上面。 //////////////////////////////////////////////////////////////////
/////////////////////////////queue////////////////////////////////
////////////////////////////////////////////////////////////////// struct Edge {
int v,nxt;
} E[MX];
int p[MX];
int Head[MX],cnt;
int indegree[MX];
int n,m,st,ed,sum; int find(int x) {
return p[x]==x?x:(p[x]=find(p[x]));
} int union_root(int a,int b) {
a=find(a);
b=find(b);
if(a!=b) {    
p[b]=a;
return 1;    //返回是否进行了绑定操作
}
return 0;
} void init() {
memset(Head,-1);
memset(E,0);
memset(indegree,0);
for(int i=0; i<=n; i++) {
p[i]=i;
}
cnt=0;
sum=n;
} void edge_add(int st,int ed) {
E[cnt].v=ed;
E[cnt].nxt=Head[st];
Head[st]=cnt++;
} void toposort() { //几乎是模版。
int information=1;
queue<int>Q;
while(!Q.empty())Q.pop();
for(int i=0; i<n; i++) {
if(!indegree[i]&&find(i)==i) //入度为0,且是根节点
Q.push(i);
}
while(!Q.empty()) {
if(Q.size()>1)information=0; //如果出现了多个入度为0的点说明没有严格排序,即信息不全,标记
int a=Q.front();
Q.pop();
sum--;
for(int i=Head[a]; ~i; i=E[i].nxt) {
int v=E[i].v;
indegree[v]--;
if(!indegree[v]) {  
Q.push(v);
}
}
}
if(sum>0)printf("CONFLICT\n"); //出现了矛盾[环]就说明错了
else if(!information)printf("UNCERTAIN\n");//信息不全
else printf("OK\n");
} int main() {
char B[MX];
int A[MX],C[MX];
while(~scanf("%d%d",&n,&m)) {
init();
for(int i=0; i<m; i++) {
cin>>A[i]>>B[i]>>C[i];
if(B[i]=='=') {
if(union_root(A[i],C[i])) sum--;//绑定两个值相等的点,如果绑定了联通块数量 --;
}
}
for(int i=0; i<m; i++) {
if(B[i]=='=')continue;//这里要跳过已经绑定了的点
if(B[i]=='>') { //按照符号去排列大小
st=find(A[i]);
ed=find(C[i]);
} else {
st=find(C[i]);
ed=find(A[i]);
}
edge_add(st,ed);
indegree[ed]++;
}
toposort();
}
return 0;
} /////////////////////////////////////////////////////////////
///////////////////// vector + queue ////////////////////////
///////////////////////////////////////////////////////////// struct Edge {
int v,nxt;
} E[MX];
int p[MX];
int indegree[MX];
int n,m,st,ed,sum; vector<int >next_node[MX]; int find(int x) {
return p[x]==x?x:(p[x]=find(p[x]));
} int union_root(int a,int b) {
a=find(a);
b=find(b);
if(a!=b) {
p[b]=a;
return 1;
}
return 0;
} void init(int n) {
memset(E,0);
memset(indegree,0);
for(int i=0; i<n; i++) {
next_node[i].clear();
p[i]=i;
}
sum=n;
} void toposort() {
int information=1;
queue<int>Q;
while(!Q.empty())Q.pop();
for(int i=0; i<n; i++) {
if(!indegree[i]&&find(i)==i)
Q.push(i);
}
while(!Q.empty()) {
if(Q.size()>1)information=0;
int a=Q.front();
Q.pop();
sum--;
for(int i=0;i<next_node[a].size();i++)
{
if(--indegree[next_node[a][i]]==0)
Q.push(next_node[a][i]);
}
}
if(sum>0)printf("CONFLICT\n");
else if(!information)printf("UNCERTAIN\n");
else printf("OK\n");
} int main() {
char B[MX];
int A[MX],C[MX];
while(~scanf("%d%d",&n,&m)) {
init(n);
for(int i=0; i<m; i++) {
cin>>A[i]>>B[i]>>C[i];
if(B[i]=='=') {
if(union_root(A[i],C[i]))sum--;
}
}
for(int i=0; i<m; i++) {
if(B[i]=='=')continue;
if(B[i]=='>') {
st=find(A[i]);
ed=find(C[i]);
} else {
st=find(C[i]);
ed=find(A[i]);
}
next_node[st].push_back(ed);
indegree[ed]++;
}
toposort();
}
return 0;
}

  


ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线的更多相关文章

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

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

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

    这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...

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

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

  4. hdu 1811 Rank of Tetris (拓扑 & 并查集)

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

  5. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

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

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

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

    题目链接: 传送门 Rank of Tetris Time Limit: 1000MS     Memory Limit: 32768 K Description 自从Lele开发了Rating系统, ...

  8. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)

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

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

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

随机推荐

  1. JS添加MD5,JS提示框

    http://pan.baidu.com/s/1kTmSp9t

  2. MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet(转载)

    转载地址:http://blog.csdn.net/21aspnet/article/details/21867241 1.安装准备 1).下载安装MyEclipse2014,这已经是最新版本. 2) ...

  3. Log4Net配置以及使用

    跟踪程序代码,及时发现程序的运行状态,是每个成熟的软件所必不可少的一个环节,网站发布到真实的环境之后,对于程序的运行状态,我们并不能想开发环境那也,点击调试.日志记录显示就尤为重要,在.NET中记录日 ...

  4. poj 1701【数学几何】

    The area Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  5. forEach 方法 (Array) (JavaScript)

    为数组中的每个元素执行指定操作. 语法 array1.forEach(callbackfn[, thisArg]) 参数 参数 定义 array1 必选.一个数组对象. callbackfn 必选.最 ...

  6. FTP的20、21端口,工作模式

    什么是FTP? FTP就是文件传输协议 File Transfer Protocol 的缩写. FTP端口号是多少? 21 FTP的端口号能改吗? 能 ftp的端口号20.21有何区别? 一个是数据端 ...

  7. SQL Server 2016将内置R语言?

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:随着大数据成为一个BuzzWord,和大数据相关的技术也变得越来越火热,其中就包括R语 ...

  8. WPF之MVVM(Step2)——自己实现DelegateCommand:ICommand

    在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类.此篇主要介绍DelegateCommand来解决上面所遇到的问题. 首先,我 ...

  9. 应用程序调试工具gdb,王明学learn

    应用程序调试工具gdb学习使用 一.GDB简介 GDB 是 GNU 发布的一款功能强大的程序调试工具.GDB 主要完成下面三个方面的功能: 1.启动被调试程序. 2.让被调试的程序在指定的位置停住. ...

  10. the last lecture

    2008.07.25,CMU教授Randy Pausch教授因癌症去世,仅47岁. 几年之前,当我看到Pausch先生最后一课的视频时,让我震撼. 转眼之间,7年过去了,这7年,让我成长了许多. 7年 ...