hdu Rank of Tetris 并查集 + 拓扑排序
2014-09-16 10:51
344 查看
题意: 给出一些大小关系,问根据这些关系能不能确定排名,如果不能, 判断是信息不完全,还是信息冲突,
分析: 1,出现冲突的情况: 当且仅当图中存在环,才会出现冲突,如:a > b, b > c, c > a, 则是冲突, 这种情况可在拓扑排序时确定,下面简要说一下拓扑排序:
拓扑排序: 每次在有向图中找出一个入度为0的节点,加入队列,并删除该节点发出的所有边(在用队列实现的过程中,可直接把与之相连的节点的入度-1, 最后,如果还剩下节点未排序,则表示出现了环,因为环中没有节点入度为0.
2. 出现信息不完全的情况,如果某一时刻,有多个入度为0的点,那么信息肯定不完全,因为这样就没法确定这些入度为0的点之间的先后关系
3. 此题的难点在于如何处理相等的情况,这种情况不能用拓扑排序来处理,因为,如果把a==b==c处理成a>b>c的话,那么有可能出现e<a, e > b是正确的情况, 所以,正确的方法是把相等的节点用并查集处理成一个节点, 这样就能用拓扑排序解出此题了:
代码:
分析: 1,出现冲突的情况: 当且仅当图中存在环,才会出现冲突,如:a > b, b > c, c > a, 则是冲突, 这种情况可在拓扑排序时确定,下面简要说一下拓扑排序:
拓扑排序: 每次在有向图中找出一个入度为0的节点,加入队列,并删除该节点发出的所有边(在用队列实现的过程中,可直接把与之相连的节点的入度-1, 最后,如果还剩下节点未排序,则表示出现了环,因为环中没有节点入度为0.
2. 出现信息不完全的情况,如果某一时刻,有多个入度为0的点,那么信息肯定不完全,因为这样就没法确定这些入度为0的点之间的先后关系
3. 此题的难点在于如何处理相等的情况,这种情况不能用拓扑排序来处理,因为,如果把a==b==c处理成a>b>c的话,那么有可能出现e<a, e > b是正确的情况, 所以,正确的方法是把相等的节点用并查集处理成一个节点, 这样就能用拓扑排序解出此题了:
代码:
#include <cstdio> #include <queue> #include <vector> #include <cstring> using namespace std; const int maxn = 1e5 + 10; int fa[maxn], in[maxn], A[maxn], B[maxn], n, m, sum; char op[maxn]; vector<int> G[maxn]; int findSet(int x) { if (x != fa[x]) { fa[x] = findSet(fa[x]); } return fa[x]; } void topSort() { queue<int> Q; bool uncertain = false; for (int i = 0; i < n; i++) { if (in[i] == 0 && findSet(i) == i) Q.push(i); } while (!Q.empty()) { if (Q.size() > 1) { uncertain = true; } int now = Q.front(); Q.pop(); sum--; for (int i = 0; i < G[now].size(); i++) { if (--in[G[now][i]]==0) { Q.push(G[now][i]); } } } if (sum>0) puts("CONFLICT"); else if(uncertain) puts("UNCERTAIN"); else puts("OK"); } int main() { // freopen("/Users/apple/Desktop/in.txt", "r", stdin); while (scanf("%d%d", &n, &m) != EOF) { for (int i = 0; i < n; i++) { fa[i] = i, in[i] = 0; G[i].clear(); } sum = n; for (int i = 0; i < m; i++) { int a, b; char s[3]; scanf("%d%s%d", &a, s, &b); op[i] = s[0], A[i] = a, B[i] = b; if (s[0] == '=') { int fx = findSet(a), fy = findSet(b); if (fx != fy) { fa[fx] = fy; sum--; } } } for (int i = 0; i < m; i++) { if (op[i] == '=') continue; int a = findSet(A[i]), b = findSet(B[i]); if (op[i] == '>') { G[a].push_back(b); in[b]++; } else { G[b].push_back(a); in[a]++; } } topSort(); } return 0; }
相关文章推荐
- Rank of Tetris(并查集和拓扑排序)
- 并查集 + 拓扑排序 hdu1811 Rank of Tetris
- Rank of Tetris (hdu 1811 拓扑排序)
- 并查集+拓扑 hdu 1811 Rank of Tetris
- HDU-1811 Rank of Tetris
- hdu 1811 Rank of Tetris
- hdu 1811Rank 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 (并查集预处理 + 拓扑排序)
- Rank of Tetris (拓扑 + 并查集)
- HDU 1811 Rank of Tetris
- hdu Rank of Tetris
- hdu 1811 Rank of Tetris
- hdu 1811 Rank of Tetris
- hdu 1811 Rank of Tetris (并查集 + 拓扑排序)