HDU 1811 Rank of Tetris 【拓扑排序】+【并查集】
<题目链接>
题目大意:
给你N个点(编号从0到N-1)和M个关系,要你判断这个图的所有点的顺序是否可以全部确定.不过对于任意点的关系可能存在A>B或A<B或A=B三种情况,如果A=B的话,那么就比较他们的编号,编号大的点分数大.(即两点之间关系如果相等,它们之间的排序也可以确定).
解题分析:
本题要处理等于的情况,单纯的拓扑排序不好处理, 因为这些等于的点与其点的关系是相同的,所以用并查集将这些等于的点进行缩点。当然,在判断冲突的时候,也要考虑到,这些等于的点之间是否会产生冲突,比如开始声明 A=B ,而后面的声明又推出A>B的结论,这种情况显然是不行的,然后就是用拓扑排序判断当前所有点是否冲突和判断是否能够确定唯一的序列。判断冲突的依据其实就是判断图中是否存在环,这个直接根据拓扑排序中依次展开成入度为0的点的个数是否等于总的点数即可,因为如果存在环,那么环中的点无论如何也不可能展开成入度为0的点。判断拓扑排序展开后的序列是否唯一则是根据拓扑排序过程中是否在同一时刻有多个入度为0的点来判断。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
;
;
int n,m,tot;
int fa[N],ind[N],head[N];
];
int a[M],b[M];
struct Edge{
int to,next;
}edges[M];
void addedge(int u,int v){
edges[++tot].to=v,edges[tot].next=head[u];
head[u]=tot;ind[v]++;
}
int find(int i){
) return i;
return fa[i]=find(fa[i]);
}
int toposort(){
queue<int> Q;
; //连通分量根数目
; //入度为0且从Q出队列的点数
bool order=true; //判断排列是否唯一
;i<n;i++)if(find(i)==i){
scc++;
) Q.push(i); //让入度为0的根节点进入队列
}
while(!Q.empty()){
) order=false; //如果队列中同时又多个入度为0的点,则说明该图不能确定唯一的排序
int u=Q.front();Q.pop();
cnt++;
;i=edges[i].next){
int v=edges[i].to;
)
Q.push(find(v)); //入度为0的点入队列
}
}
; //如果在拓扑排序中,入度为0的"点"数<所有的"点"数,说明该图中必然有环,存在冲突
; //可确定唯一排序
; //即不冲突,又不可确定唯一的排序
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(head,-,sizeof(head));
memset(fa,-,sizeof(fa));
memset(ind,,sizeof(ind));
tot=;
; //判断结果的状态
;i<m;i++){ //将所有具有等于关系的进行缩点
scanf("%d%s%d",&a[i],str[i],&b[i]);
]=='='){
int u=a[i], v=b[i];
u=find(u), v=find(v);
if(u!=v) fa[u]=v; //用并查集进行缩点
}
}
;i<m;i++){ //添加有向边,且判断"点"中是否冲突
int u=a[i], v=b[i];
]!='='){ //判断该缩点后的"点"中是否存在冲突
ans=-; //冲突
break;
}
]=='<') addedge(find(v),find(u)); //添加有向边
]=='>') addedge(find(u),find(v));
}
) ans=toposort();
) printf("CONFLICT\n");
) printf("UNCERTAIN\n");
) printf("OK\n");
}
}
2018-11-20
HDU 1811 Rank of Tetris 【拓扑排序】+【并查集】的更多相关文章
- 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高手排行榜, ...
- hdu1811 Rank of Tetris 拓扑排序+并查集
这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...
- Rank of Tetris 拓扑排序+并查集
Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子: ...
- 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 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- 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: 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 (并查集+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- ORA-00257 archiver error. 错误的处理方法
archive log 日志已满 方法/步骤 1 SecureCRT登录服务器,切换用户oracle,连接oracle [root@userbeta~]# su - oracle [oracle@us ...
- Java 开源博客 Solo 2.5.0 发布
Java 开源博客 Solo 2.5.0 发布 Solo 是一款一个命令就能搭建好的 Java 开源博客系统,如果你想开个独立博客,请一定不要错过! 2.5.0 版本主要支持了 Markdown/JS ...
- vue-cli3初尝试之路径别名配置
let path = require('path') function resolve(dir) { return path.join(__dirname, dir) } module.exports ...
- hdu5015构造转移矩阵
/* 构造转移矩阵: 先推公式: 首先是第0行:A[0][j+1]=A[0][j]*10+3 1-n行: A[i][j+1]=A[i][j]+A[i-1][j+1]=... =A[i][j]+A[i- ...
- bzoj 1951
这道题告诉了我们一个很重要的道理:看到题,先想明白再动手! 题意:求对999911659取模的值 首先,由于n的数据范围不是很大(至少不是很大),所以可以O()枚举所有约数分别求组合数 但是有个问题: ...
- 性能测试四十二:sql案例之联合索引最左前缀
联合索引:一个索引同时作用于多个字段 联合索引的最左前缀: A.B.C3个字段--联合索引 这个时候,可以使用的查询条件有:A.A+B.A+C.A+B+C,唯独不能使用B+C,即最左侧那个字段必须匹配 ...
- C++ Primer 笔记——运行时类型识别
1.dynamic_cast运算符的使用形式如下: dynamic_cast<type*>(e) // e必须是一个有效指针 dynamic_cast<type&>(e ...
- 配置webpack loader vue 报错:Module build failed: TypeError: this._init is not a function
单文件组件 引入时报错 配置webpage.config.js中的vue 需要如下写法 { test: /\.vue/, loader: "vue-loader", } 之前写的l ...
- 读书笔记——《You Don't Know JS》
第一部:<You don't know JS: this & Object prototype> 第三章 Object 对象常量 var myObject = {}; Object ...
- linux基础练习题(2)
Linux命令作业(关卡二) 练习题1 理解操作系统的作用,以及各种操作系统的不同 要求: 为什么要有OS?没有OS能行吗?原因是什么? Linux内核指的是什么? Linux主要应用在哪些地方? 使 ...