【HDOJ】1811 Rank of Tetris
2014-06-06 12:04
281 查看
并查集+拓扑排序。使用并查集解决a = b的情况。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; #define MAXN 10005 typedef struct ArcNode { int adjvex; ArcNode *next; } ArcNode; typedef struct VNode { int count; ArcNode *first; } VNode; VNode nodes[MAXN]; int pre[MAXN], n; int srca[MAXN<<1],srcb[MAXN<<1]; char op[MAXN<<1]; bool flag; int find(int x) { int r = x; while (r != pre[r]) r = pre[r]; return r; } void merge(int a, int b) { int x = find(a); int y = find(b); pre[x] = y; } void Insert(int x, int y) { ArcNode *p = new ArcNode; nodes[y].count++; p->adjvex = y; p->next = nodes[x].first; nodes[x].first = p; } int main() { int m; int i, j, x, y; while (scanf("%d %d",&n,&m) != EOF) { for (i=0; i<n; ++i) { nodes[i].count = 0; nodes[i].first = NULL; pre[i] = i; } for (i=0; i<m; ++i) { scanf("%d %c %d", &srca[i], &op[i], &srcb[i]); if (op[i] == '=') merge(srca[i], srcb[i]); } flag = false; for (i=0; i<m; ++i) { if (op[i] == '=') continue; x = find(srca[i]); y = find(srcb[i]); if (x == y) { flag = true; break; } if (op[i] == '>') Insert(x, y); else Insert(y, x); } if (flag) { printf("CONFLICT\n"); continue; } queue<int> que; int index; ArcNode *p; m = 0; for (i=0; i<n; ++i) { if (i==find(i)) { ++m; if (nodes[i].count==0) que.push(i); } } while (!que.empty()) { if (que.size() > 1) flag = true; index = que.front(); que.pop(); p = nodes[index].first; --m; while (p != NULL) { j = p->adjvex; --nodes[j].count; if (nodes[j].count == 0) que.push(j); p = p->next; } } if (m) printf("CONFLICT\n"); else if (flag) printf("UNCERTAIN\n"); else printf("OK\n"); } return 0; }
相关文章推荐
- hdoj 1811 Rank of Tetris 【拓扑】+【并查集】
- hdoj-1811-Rank of Tetris【并查集+拓扑排序】
- HDOJ 1811 Rank of Tetris (拓扑排序+并查集)
- [HDOJ1811]Rank of Tetris(并查集、拓扑排序)
- hdoj 1811 Rank of Tetris【拓扑排序 + 并查集】
- HDOJ 1811 Rank of Tetris(拓扑+并查集)
- HDOJ 1811 Rank of Tetris (并查集+topo)
- HDOJ 1811 Rank of Tetris(拓扑排序+并查集)
- hdu-1811-Rank of Tetris-并查集+拓扑排序
- 【拓扑排序】 HDOJ 1811 Rank of Tetris
- hdu 1811 Rank of Tetris 并查集+拓扑排序,,提高题
- hdu 1811 Rank of Tetris (拓扑 & 并查集)
- hdu 1811 Rank of Tetris
- HDOJ 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 Problem 1811 Rank of Tetris【拓扑排序+并查集】
- hdu 1811 Rank of Tetris (并查集+拓扑排序)