hdu 1811 Rank of Tetris (并查集+拓扑排序)
2014-04-09 14:53
316 查看
题意:
有编号为0-n-1的n个人,用>、=、<给出它们之间的rating关系,如果rating相等,
按RP从高到低排。编号越大RP越高。
给出m个RATING关系,判断根据这些信息能否确定高手榜,如果能,输出OK。
如果信息冲突就输出CONFLICT,如果信息不完全则输出UNCERTAIN。
算法:
先把相等Rating的编号用并查集合并。用根节点来代替这个集合。
然后根据大小关系建图,按父子关系用邻接表存图,同时记录每个节点(合并后)的入度。
最后拓扑排序,用队列保存入度为0的点。
那么可以得到,队列中如果元素个数大于1,则信息不完全。
如果待排队的次数小于元素个数,则图中存在环,也就是信息冲突。
有编号为0-n-1的n个人,用>、=、<给出它们之间的rating关系,如果rating相等,
按RP从高到低排。编号越大RP越高。
给出m个RATING关系,判断根据这些信息能否确定高手榜,如果能,输出OK。
如果信息冲突就输出CONFLICT,如果信息不完全则输出UNCERTAIN。
算法:
先把相等Rating的编号用并查集合并。用根节点来代替这个集合。
然后根据大小关系建图,按父子关系用邻接表存图,同时记录每个节点(合并后)的入度。
最后拓扑排序,用队列保存入度为0的点。
那么可以得到,队列中如果元素个数大于1,则信息不完全。
如果待排队的次数小于元素个数,则图中存在环,也就是信息冲突。
#include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<vector> using namespace std; int A[20010],B[20010],fa[10010],in[10010],rank[10010],sum; char op[20010]; vector<int> G[10010]; int init(int x) { for(int i=0;i<x;i++) { fa[i]=i; rank[i]=0; } sum = x; for(int i=0;i<x;i++) { G[i].clear(); in[i]=0; } } int find(int x) { int t=x,l=x; while(fa[t]!=t) t = fa[t]; while(fa[l]!=t) { int tmp = fa[l]; fa[l]=t; l = tmp; } return t; } bool merge(int a,int b) { int fx = find(a); int fy = find(b); if(fx==fy) return false; else { if(rank[a]>rank[b]) fa[b]=a; else { if(rank[a]==rank[b]) rank[b]++; fa[a]=b; } } return true; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { init(n); for(int i=1;i<=m;i++) { scanf("%d %c %d",&A[i],&op[i],&B[i]); if(op[i]=='=') { if(merge(A[i],B[i])) sum--; } } for(int i=1;i<=m;i++) { if(op[i]!='=') { int fx = find(A[i]); int fy = find(B[i]); if(op[i]=='>') { G[fx].push_back(fy); in[fy]++; } else { G[fy].push_back(fx); in[fx]++; } } } queue<int> q; for(int i=0;i<n;i++) { if(in[i]==0 && fa[i]==i) q.push(i); } int flag=0; while(!q.empty()) { if(q.size()>1) flag=1; int u = q.front(); q.pop(); --sum; for(int i=0;i<G[u].size();i++) { int v = G[u][i]; --in[v]; if(in[v]==0) q.push(v); } } if(sum>0) printf("CONFLICT\n"); else if(flag) printf("UNCERTAIN\n"); else printf("OK\n"); } 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 并查集+拓扑排序
- 【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(并查集+拓扑排序)