hdu-1811 Rank of Tetris
来源:互联网 发布:阿里云静态网站搭建 编辑:程序博客网 时间:2024/05/09 14:23
http://acm.hdu.edu.cn/showproblem.php?pid=1811
题意很简单,关键在于处理‘=’的 情况,如果两个人的rating相等的话,其实可以看成一个人,那么这就用到了并查集来合并。
然后信息不完全或者冲突的情况可以做一遍拓扑排序的过程,初始sum=n,然后如果排序完了还是sum>0 就表示构成了环,所以导致冲突。
用一个标志位表示如果队列的size>1 那么肯定信息不完全,因为首先加入队列里面的就是入度为0,并且不是同一个祖先的点,如果有多个点满足,那么肯定这些点彼此之间的关系无法判断。具体看代码。
#include<cstdio>#include<vector>#include<queue>#include<cstring>#define N 10001#define maxn 20001using namespace std;int f[N],in[N],n,sum;int x[maxn],y[maxn];char z[maxn];vector<int>num[N];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;}
0 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
- 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
- 使用字符指针将字符串逆序输出
- 数组的指针特性
- 【JAVA】JAVA线程池——ThreadPoolExecutor
- 黑马程序员--面向对象
- 冒泡排序和快速排序耗时比较(时间复杂度的理想与现实)
- hdu-1811 Rank of Tetris
- DSP-BIOS使用入门
- java thin 连接oracle url的几种写法
- 使用Tcl脚本分配FPGA管脚
- 第十一章 11.1节练习
- POJ 1321 棋盘分割 DFS
- POJ 2991
- Markdown中插入数学公式的方法
- 2014 阿里巴巴 校招 测试开发工程师 笔试题