hdu 1811 Rank of Tetris(拓扑,并查集)
题意:略
分析:排序先按rating,若相同,则按rp。考虑到每个人的rp均不同,所以rating相同的人必然可以排序。那么只需要考虑rating不同的集合了。
大小关系可以用有向边表示,而大小关系的传递可以用拓扑排序来呈现。
接着就要分析,三种结果对应的情况了。
很明显,ok要求拓扑出来的必须是一条链,一旦有分支,分支处的两个(或多个)点的大小关系就不明确,也就是条件不足=>uncertain。
而矛盾conflict有两种情况:1、更改关系0=1,0>1;2、自相矛盾,即成环,0>1,0<1。
注意:在条件不足和矛盾同时发生时,要求输出的是矛盾conflict。
这里要注意,拓扑排序是可以判环的:只要完成拓扑后,发现还有点没有加入队列,那么就说明他们之间成环。若不成环,必然可以把所有点加入队列。
学习了vector的find函数

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std; const int MAXN=; struct Edge{
int x,y;
char op;
}edge[MAXN<<]; vector<int>G[MAXN];
queue<int>q;
int in[MAXN],f[MAXN];
int inq[MAXN]; void init(int n)
{
for(int i=;i<n;i++)
f[i]=i; memset(in,,sizeof(in)); for(int i=;i<n;i++)
G[i].clear();
} int Find(int x)
{
return f[x]==x?x:f[x]=Find(f[x]);
} int top(int n)
{
int flog=;
while(!q.empty())
q.pop();
memset(inq,,sizeof(inq));//判入队 for(int i=;i<n;i++)
{
int x=Find(i);
if(x!=i)//忽略所有集合中除根以外的点
inq[i]=;
else if(in[x]==){
q.push(x);
inq[x]=;
}
}
if(q.empty())//队空,成环,冲突
return -;
while(!q.empty())
{
if(q.size()>=)//多叉,不分先后,条件不足
flog=; int u=q.front();q.pop();
int sz=G[u].size();
for(int i=;i<sz;i++)
{
int v=G[u][i];
in[v]--;
if(in[v]==){
if(inq[v])//成环,冲突
return -;
else {
q.push(v);
inq[v]=;
}
}
}
}
for(int i=;i<n;i++)
if(!inq[i])//不能全部拓扑,成环,冲突
return -;
return flog;
} int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int flog=;
init(n);
for(int i=;i<m;i++)
{
scanf("%d %c %d",&edge[i].x,&edge[i].op,&edge[i].y);
if(edge[i].op=='='){
int a=Find(edge[i].x);
int b=Find(edge[i].y);
f[a]=b;
}
}
for(int i=;i<m;i++)
{
if(edge[i].op=='=')
continue; int a=Find(edge[i].x);//所有处理都是对集合的根做操作
int b=Find(edge[i].y);
if(a==b)
flog=-;
if(flog==-)
break; if(edge[i].op=='<'){
if(find(G[b].begin(),G[b].end(),a)==G[b].end()){//去重,长知识了
G[b].push_back(a);
in[a]++;
}
}else{
if(find(G[a].begin(),G[a].end(),b)==G[a].end()){
G[a].push_back(b);
in[b]++;
}
}
}
if(flog==-){
printf("CONFLICT\n");
continue;
}
flog=top(n);
if(flog==-)
printf("CONFLICT\n");
else if(flog==)
printf("UNCERTAIN\n");
else
printf("OK\n");
}
return ;
}
/*
4 3
0 < 1
1 < 2
2 < 0 4 3
0 > 1
1 < 2
0 > 2 4 3
1 = 2
0 < 1
3 > 2 4 3
1 = 2
0 < 1
0 > 2 3 3
1 = 2
2 = 0
1 > 2 3 1
1 < 2
*/
hdu 1811 Rank of Tetris(拓扑,并查集)的更多相关文章
- 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(并查集按秩合并+拓扑排序)
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)To ...
- 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 - 拓扑排序 - 并查集
自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...
- HDU 1811:Rank of Tetris(并查集+拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系 ...
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
题目链接: 传送门 Rank of Tetris Time Limit: 1000MS Memory Limit: 32768 K Description 自从Lele开发了Rating系统, ...
- 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 【拓扑排序】+【并查集】
<题目链接> 题目大意: 给你N个点(编号从0到N-1)和M个关系,要你判断这个图的所有点的顺序是否可以全部确定.不过对于任意点的关系可能存在A>B或A<B或A=B三种情况,如 ...
- HDU 1811 Rank of Tetris 拓补排序+并查集
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) [ ...
随机推荐
- (8)oracle 表的增删改
表的命名 表需要字母开头 只能用如下字符 A-Z,a-z,0-9,$,#. 不能使用oracle保留字 长度不能超过30 创建一张表 create table 表名(字段名 数据类型,字段名 数据类型 ...
- request与response对象.
request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在 ...
- Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__
魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...
- (转)unity3d加密资源并缓存加载
http://www.haogongju.net/art/1931680 首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止依然没有更新正确的示例代码. view source pr ...
- 用gulp+webpack构建多页应用——记一次Node多页应用的构建过程
通过参考网上的一些构建方法,当然也在开发过程中进行了一番实践,最终搭建了一套适用于当前多页应用的构建方案,当然该方案还处于draft版本,会在后续的演进过程中不断的优化. 个人觉得该方案的演进过程相对 ...
- Python学习笔记——基本数据结构
列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...
- 工作组模式下专用队列(Private Queue)如何引用远程队列路径
查了N久资料,包括MSDN的官方文档,对于同一工作组下,不同机器之间如何利用Private Queue(专用队列)来发送/接收消息,关于Path的引用一说,无非都是MachineName\privat ...
- 分布式数据库以及OS
http://blog.csdn.net/longronglin/article/category/230501
- Excel设置下拉菜单并隐藏下拉菜单来源单元格内容
一.问题来源 做实验室的进展统计表,老师让加上开始时间和完成时间,时间格式:周几_上午(下午.晚上). 这样就可以了做下拉菜单,方便填写,而且格式统一,方便查看. 二.解决办法 2.1 下来菜单 红框 ...
- Visio整体移动
同理选中第一列的两个,按向右箭头,整体友谊.