HDOJ 1811 Rank of Tetris (并查集+topo)
2016-07-10 16:12
399 查看
题意
给出一些人之间的rating高低或等于关系,判断给出的关系是否冲突,能不能通过这些排出所有人。思路
如果没有等于的话这个题是个比较经典的拓扑排序,加上等于之后我们每次相等的两边的关系需要合并,所以用并查集专门维护一下相等时的关系集合,其他的拓扑排序来做即可。代码
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> using namespace std; #define LL long long #define Lowbit(x) ((x)&(-x)) #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1|1 #define MP(a, b) make_pair(a, b) const int INF = 0x3f3f3f3f; const int Mod = 1000000007; const int maxn = 10000 + 7; const double eps = 1e-8; const double PI = acos(-1.0); typedef pair<int, int> pii; int n, m; int fa[maxn]; int a[maxn], b[maxn]; char op[maxn]; int in[maxn], cnt, flag; vector<int> G[maxn]; void init() { for (int i = 0; i <= n; i++) fa[i] = i; for (int i = 0; i <= n; i++) in[i] = 0, G[i].clear(); flag = 0; cnt = n; } int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } bool merge(int a, int b) { int u = find(a); int v = find(b); if (u == v) return false; if (u > v) fa[v] = u; else fa[u] = v; return true; } void toposort() { queue<int> q; for (int i = n - 1; i >= 0; i--) if (!in[i] && find(i) == i) q.push(i); while (!q.empty()) { if (q.size() > 1) flag = 1; int u = q.front(); q.pop(); cnt--; for (int i = 0; i < G[u].size(); i++) { in[G[u][i]]--; if (in[G[u][i]] == 0) q.push(G[u][i]); } } } int main() { //freopen("H:\\in.txt","r",stdin); //freopen("H:\\out.txt","w",stdout); while (scanf("%d%d", &n, &m) != EOF) { init(); for (int i = 0; i < m; i++) { scanf("%d %c %d", &a[i], &op[i], &b[i]); if (op[i] == '=' && merge(a[i], b[i])) cnt--; } for (int i = 0; i < m; i++) { int u = find(a[i]); int v = find(b[i]); if (op[i] == '<') { G[v].push_back(u); in[u]++; } else if (op[i] == '>') { G[u].push_back(v); in[v]++; } } flag = 0; toposort(); if (cnt > 0) puts("CONFLICT"); else if (flag) puts("UNCERTAIN"); else puts("OK"); } return 0; }
相关文章推荐
- 第一个简单的 OpenGL 应用程序
- Docker使用---静态网站测试
- 在IIS中浏览网站时出现:无法打开登录所请求的数据库 "***",登录失败
- Master Nginx(7) - Nginx for the Developer
- 翻写Nehe的OpenGL教程
- vs2010中配置OpenGL
- Linux环境安装Eclipse及配置hadoop插件
- OpenCV 检测图片上的条形码
- Configure LDAP Server(centos7 openldap)
- Linux I/O重定向详解及例子
- 关于Linux发行版的选择
- Hadoop基准测试工具
- shell中的环境变量
- Linux下USB驱动框架分析【转】
- 常见问题
- 分布式系统设计系列 -- 基本原理及高可用策略
- /etc/profile和~/.bash_profile等文件的区别和联系
- Linux文件查找命令find,xargs详述【转】
- Linux内核内存管理-内存访问与缺页中断【转】
- Linux学习总结—缺页中断和交换技术【转】