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) [ ...
随机推荐
- Burnside引理与polay定理
#Burnside引理与polay定理 引入概念 1.置换 简单来说就是最元素进行重排列 是所有元素的异议映射,即\([1,n]\)映射到\([1,n]\) \[ \begin{pmatrix} 1& ...
- luogu P1069 细胞分裂
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家.现在,他正在为一个细胞实 验做准备工作:培养细胞样本. Hanks 博士手里现在有 N 种细胞,编号从 1~N,一个 ...
- [POJ 2329] Nearest number-2
Link: POJ 2329 传送门 Solution: 比较明显的$dp$,但爆搜好像也能过 用多个方向$dp$来解决此题,最后汇总答案即可 一开始我写了4个,但后来发现只要相反的2个方向即可,同时 ...
- apache mod_speling.so 忽略URL大小写(自动纠错)
apache mod_speling.so 忽略URL大小写(自动纠错) 打开配置文件 httpd.conf 加入 LoadModule speling_module modules/mod_spe ...
- 一次快速改写 SQL Server 高效查询的范例
原文:一次快速改写 SQL Server 高效查询的范例 最近線上系統突然出現匯出資料超過 10 筆時,查詢逾時的狀況,在仔細查找之後. 發現了問題原因,透過應用端與數據端兩邊同時調整,將查詢的效率提 ...
- 安卓查看包名,activity方法
https://www.cnblogs.com/wangcp-2014/p/6144530.html 一.有源码情况 直接打开AndroidManifest.xml文件,找到包含android.int ...
- Android API level 与version对应关系
https://www.cnblogs.com/jinglecode/p/7753107.html Platform Version API Level VERSION_CODE 中文名称 Andro ...
- C#中out与ref区别
一.ref(参考)与out区别 1.out(只出不进) 将方法中的参数传递出去,在方法中将该参数传递出去之前需要在该方法起始赋初值:在方法外传递的该参数可以不用赋值: 简单理解就是:将一个东西抛出去之 ...
- 【Zookeeper】Zookeeper部署笔记
Zookeeper部署笔记 .上传zk安装包 .解压 .配置(先在一台节点上配置) .1添加一个zoo.cfg配置文件 $ZOOKEEPER/conf mv zoo_sample.cfg zoo.cf ...
- Centos 7 联想Y430P无线网卡驱动安装 过程参考
Centos 7 联想Y430P无线网卡驱动安装 过程参考 ABRT 已检测到 [root@endv ~]# yum install -y rdesktop 已加载插件:fastestmirror, ...