HDU 1811 Rank of Tetris(并查集+拓扑排序)
2016-08-20 11:45
337 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811
题意:给出n个点,m个关系。
问给定的关系,如果存在矛盾,输出
思路:不需要考虑相等的时候的大小关系,把相等的点都看作一个点(用并查集来缩成一个点),然后对缩点后的图,跑一遍拓扑排序即可。
注意:当矛盾和不确定同时存在时,首先输出矛盾。
代码:
题意:给出n个点,m个关系。
u > v表示
u的rating高于
v的。
u < v表示
u的rating低于
v的。
u = v表示
u的rating等于
v的,则最后的排序按照标号大小来排。
问给定的关系,如果存在矛盾,输出
CONFLICT,如果存在不确定的,输出
UNCERTAIN;都没有输出
OK。
思路:不需要考虑相等的时候的大小关系,把相等的点都看作一个点(用并查集来缩成一个点),然后对缩点后的图,跑一遍拓扑排序即可。
注意:当矛盾和不确定同时存在时,首先输出矛盾。
代码:
#include <stdio.h> #include <queue> #include <string.h> #include <algorithm> #include <vector> #include <iostream> using namespace std; const int N = 1e4 + 10; vector<int> g , h ; char answer[3][20] = {"OK", "CONFLICT", "UNCERTAIN"}; int in , f ; bool vis ; // 记录当前点是否还在缩点后的图中 int n, m; int _find(int x) { return f[x] = (f[x] == x ? x : _find(f[x])); } int tp_sort() { int ct = m, res = 0; queue<int> q; for (int i = 0; i < n; i++) { if (in[i] == 0 && vis[i]) { q.push(i); ct--; } } while (!q.empty()) { if (q.size() > 1) res = 2; int u = q.front(); q.pop(); for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; in[v]--; if (in[v] == 0) { q.push(v); ct--; } } } if (ct > 0) return 1; return res; } void init() { int ct = 0; for (int i = 0; i < n; i++) { int fi = _find(i); if (fi != i) { ct++; vis[i] = false; } for (int j = 0; j < h[i].size(); j++) { int fj = _find(h[i][j]); g[fi].push_back(fj); in[fj]++; } } m = n - ct; } int main() { while (scanf("%d%d", &n, &m) != EOF) { for (int i = 0; i < n; i++) { h[i].clear(); g[i].clear(); } memset(in, 0, sizeof(in)); memset(vis, true, sizeof(vis)); for (int i = 0; i < n; i++) f[i] = i; for (int i = 0; i < m; i++) { int u, v; char o[2]; scanf("%d%s%d", &u, o, &v); int fu = _find(u); int fv = _find(v); if (o[0] == '<') { h[v].push_back(u); } else if (o[0] == '>') { h[u].push_back(v); } else if (o[0] == '=') { if (fu != fv) f[fu] = fv; } else { printf("Error\n"); } } init(); // 缩点,并转换图 int res = tp_sort(); printf("%s\n", answer[res]); } return 0; }
相关文章推荐
- hdu 1811 Rank of Tetris 【并查集+拓扑排序】
- HDU-1811 Rank of Tetris 并查集+拓扑排序
- HDU 1811 Rank of Tetris 【并查集+拓扑排序】
- HDU 1811 Rank of Tetris (并查集+拓扑排序)
- hdu 1811 Rank of Tetris(并查集+拓扑排序)
- hdu1811 Rank of Tetris (并查集+拓扑排序)
- hdu 1811 Rank of Tetris【并查集+拓扑排序】
- hdu 1811 Rank of Tetris(并查集+拓扑排序)
- HDU 1811 Rank of Tetris(并查集+拓扑排序)
- hdu 1811 Rank of Tetris 并查集+拓扑排序
- hdu 1811-Rank of Tetris(并查集+拓扑排序)
- HDU 1811 Rank of Tetris(并查集+拓扑排序)
- HDU 1811 Rank of Tetris 并查集+拓扑排序
- hdu 1811 Rank of Tetris (并查集+拓扑排序)
- hdu-1811-Rank of Tetris-并查集+拓扑排序
- hdu 1811 Rank of Tetris 并查集+拓扑排序
- hdu 1811 Rank of Tetris (并查集+拓扑排序)
- HDU 1811 Rank of Tetris(并查集+拓扑排序)
- hdu 1811 Rank of Tetris 并查集+拓扑排序★★
- 【HDU】1811 Rank of Tetris 并查集+拓扑排序