hdu-1811 Rank of Tetris
2014-08-28 20:32
190 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1811
题意很简单,关键在于处理‘=’的 情况,如果两个人的rating相等的话,其实可以看成一个人,那么这就用到了并查集来合并。
然后信息不完全或者冲突的情况可以做一遍拓扑排序的过程,初始sum=n,然后如果排序完了还是sum>0 就表示构成了环,所以导致冲突。
用一个标志位表示如果队列的size>1 那么肯定信息不完全,因为首先加入队列里面的就是入度为0,并且不是同一个祖先的点,如果有多个点满足,那么肯定这些点彼此之间的关系无法判断。具体看代码。
题意很简单,关键在于处理‘=’的 情况,如果两个人的rating相等的话,其实可以看成一个人,那么这就用到了并查集来合并。
然后信息不完全或者冲突的情况可以做一遍拓扑排序的过程,初始sum=n,然后如果排序完了还是sum>0 就表示构成了环,所以导致冲突。
用一个标志位表示如果队列的size>1 那么肯定信息不完全,因为首先加入队列里面的就是入度为0,并且不是同一个祖先的点,如果有多个点满足,那么肯定这些点彼此之间的关系无法判断。具体看代码。
#include<cstdio> #include<vector> #include<queue> #include<cstring> #define N 10001 #define maxn 20001 using namespace std; int f ,in ,n,sum; int x[maxn],y[maxn]; char z[maxn]; vector<int>num ; void init() { sum=n; for(int i=0;i<n;i++) { in[i]=0; f[i]=i; num[i].clear(); } } int find(int x) { if(x==f[x]) return x; f[x]=find(f[x]); return f[x]; } int Union(int x,int y) { int a=find(x); int b=find(y); if(a==b) return 0; f[b]=a; return 1; } void top_sort() { queue<int>q; int flag=0; for(int i=0;i<n;i++) if(in[i]==0&&f[i]==i) q.push(i); while(!q.empty()) { if(q.size()>1) flag=1; int x=q.front(); q.pop(); sum--; for(int i=0;i<num[x].size();i++) { in[num[x][i]]--; if(in[num[x][i]]==0) q.push(num[x][i]); } } if(sum>0) printf("CONFLICT\n"); else if(flag) printf("UNCERTAIN\n"); else printf("OK\n"); } int main() { //freopen("a.txt","r",stdin); int m; while(scanf("%d%d",&n,&m)!=EOF) { init(); for(int i=0;i<m;i++) { scanf("%d %c %d",&x[i],&z[i],&y[i]); if(z[i]=='=') { if(Union(x[i],y[i])) sum--; } } for(int i=0;i<m;i++) { if(z[i]!='=') { int fx=find(x[i]); int fy=find(y[i]); if(z[i]=='>') { num[fx].push_back(fy); in[fy]++; } else { num[fy].push_back(fx); in[fx]++; } } } top_sort(); } 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
- Rank of Tetris (hdu 1811 拓扑排序)
- 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