链接:http://acm.hdu.edu.cn/showproblem.php?

pid=1811

Rank of Tetris

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6539    Accepted Submission(s): 1845

Problem Description
自从Lele开发了Rating系统。他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。

为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响。关于怎样排名。这个不用说都知道是依据Rating从高到低来排,假设两个人具有同样的Rating,那就按这几个人的RP从高到低来排。

最终,Lele要開始行动了。对N个人进行排名。为了方便起见,每一个人都已经被编号,分别从0到N-1,而且编号越大,RP就越高。

同一时候Lele从狗仔队里取得一些(M个)关于Rating的信息。这些信息可能有三种情况,各自是"A > B","A = B","A < B"。分别表示A的Rating高于B,等于B,小于B。

如今Lele并非让你来帮他制作这个高手榜。他仅仅是想知道,依据这些信息是否可以确定出这个高手榜,是的话就输出"OK"。否则就请你推断出错的原因。究竟是由于信息不全然(输出"UNCERTAIN"),还是由于这些信息中包括冲突(输出"CONFLICT")。

注意,假设信息中同一时候包括冲突且信息不全然,就输出"CONFLICT"。

Input
本题目包括多组測试,请处理到文件结束。
每组測试第一行包括两个整数N,M(0<=N<=10000,0<=M<=20000),分别表示要排名的人数以及得到的关系数。

接下来有M行,分别表示这些关系

Output
对于每组測试,在一行里按题目要求输出
Sample Input
3 3 0 > 1 1 < 2 0 > 2 4 4 1 = 2 1 > 3 2 > 0 0 > 1 3 3 1 > 0 1 > 2 2 < 1
Sample Output
OK CONFLICT UNCERTAIN

做法:把等于的用并查集放一起,找出最小的数,也就是入度为零的数。然后開始拓扑,拓扑就是每次把入度为0,也就是剩下点中最小的数拿来,再把它的上一个入度减掉。

假设有点没訪问,就是说明有环,说明矛盾。

假设队列同一时候有两个点在,说明这两个点大小关系不明,不明白。

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int f[10010];int find(int x){return x==f[x]?x:f[x] = find(f[x]);}  //初始化为自己
void Union(int x, int y){int fx = find(x), fy = find(y);if(fx == fy)return ;if(fx>fy) swap(fx,fy);f[fx] = f[x] = f[y] = fy;//这样 就能够直接查f[i]  推断祖先了
}int num[20010][2];
int bi[20010];
vector <int>vec[10010];int du[10010];
int  main()
{int T;int n,m,nn,mm;char a; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++){f[i]=i;vec[i].clear();du[i]=0;//入度  为0 说明是最小的}for(int j=0; j<m; j++){ scanf("%d %c %d",&num[j][0],&a,&num[j][1]);num[j][0]++;num[j][1]++;if(a=='>'){bi[j]=1; }else if(a=='='){Union(num[j][0],num[j][1]);bi[j]=0;}else{bi[j]=-1; }}for(int j=0;j<m;j++){if(bi[j]==1){du[find(num[j][0])]++;vec[find(num[j][1])].push_back(num[j][0]);}else if(bi[j]==-1){du[find(num[j][1])]++;vec[find(num[j][0])].push_back(num[j][1]);}}int numb=0;int sum=0;queue<int>q;while(!q.empty())q.pop();for(int i=1;i<=n;i++)//開始最小的{if(find(i)==i)sum++;if(du[find(i)]==0){q.push(find(i));du[find(i)]=-1;//表示已经訪问过了,numb++;}}int flag=0;if(q.size()>1)//假设有两个同一时候入队  说明两者之间没有大小关系 不明白flag=1;while(!q.empty()){int tt=q.front();q.pop();tt=find(tt);  for(int i=0;i<vec[tt].size();i++){int dian=find(vec[tt][i]);du[dian]--; if(du[dian]==0){q.push(dian);du[dian]=-1;numb++;}} if(q.size()>1)flag=1;}if(numb<sum)//假设有没訪问过的点 就是有自环。说明矛盾flag|=2;if(flag==0)puts("OK");else if(flag==1)puts("UNCERTAIN");else if(flag==2)puts("CONFLICT");else puts("CONFLICT");}return 0;
}

hdu 1811 Rank of Tetris 并查集+拓扑排序相关推荐

  1. hdu 1811 Rank of Tetris (并查集+拓扑排序)

    Problem - 1811 感觉这题的并查集以及拓扑排序并不难,但是做题的时候必须理解到矛盾(CONFLICT)与不确定(UNCERTAIN)直接的优先关系. 做这题的时候,构图什么的很简单,就是没 ...

  2. HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me

    link 题意: 首先看到排名自然想到拓扑序,但是存在等于的情况,这就启发我们把等于的情况缩成一个点,让后在缩点后的图中进行拓扑即可. 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点,所以只需要检 ...

  3. hdu 1811Rank of Tetris (并查集 + 拓扑排序)

    1 /* 2 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B ...

  4. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  5. HDU 1811 Rank of Tetris

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. HDU——1272小希的迷宫(并查集+拓扑排序)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  7. hdu5222 Exploration【并查集+拓扑排序】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5222 题意:有一个探险家,探险一个地方,这个地方有n个洞穴,有若干条边,有的边是有向边,有的是无向边, ...

  8. Mr. Kitayuta‘s Technology CodeForces - 505D(并查集+拓扑排序或dfs找环) 题解

    题目  Shuseki Kingdom is the world's leading nation for innovation and technology. There are n cities ...

  9. 家谱树 (并查集拓扑排序)

    目录 拓扑排序 Kahn. 最后附上Kahn的代码: 链式前向星做法: 其次是我用Kahn做的家谱树的代码(矩阵): 其次是我用Kahn做的家谱树的代码(链式前向星): [题目描述] 有个人的家族很大 ...

  10. HDOJ 1811 Rank of Tetris

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

最新文章

  1. 使用DDMS抓取安卓APP的奔溃日志
  2. lintcode:删除链表中指定元素
  3. Spring学习总结3——配置datasource三种方式
  4. 美团疯狂地推共享充电宝,使出杀手锏!商家:我们不敢不用
  5. 软件开发中的成本意识
  6. jspstudy启动mysql失败_JspStudy配置Jspxcms安装教程,以及数据库设置;
  7. 计算机无法启动bios,笔记本进不了bios的解决方法
  8. XSS进阶一 ——合天网安实验室学习笔记
  9. linux c 获取usb vid,Linux如何使用libudev获取USB设备VID及PID
  10. 对于拉格朗日乘数法的个人理解
  11. iOS appIcon生成和设置
  12. 微信防撤回python_python实现微信防撤回神器
  13. 欧氏空间距离和内积_欧式空间、内积空间和赋范空间之间的关系
  14. 中鑫吉鼎|白领投资理财有哪些注意事项
  15. Win10下如何修改系统用户目录名称
  16. 数据结构与算法(十一)Trie字典树
  17. OCR最佳实践项目汇总
  18. NAT 模式下网关设置
  19. 六十星系之11紫微破军坐丑未
  20. 量子计算 18 量子算法3 (RSA Shor)

热门文章

  1. 【观点讨论与支撑】明星和成功人士真的就只有成功的一面吗?背后的心酸和痛苦的经历我感觉更重要!
  2. 页面置换算法(FIFO、LRU、LFU)c++实现
  3. 国内外网站服务器研究现状,国内地学科普网站现状研究
  4. 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
  5. 大学mysql期末试题_大学期末考试综合实训试题一
  6. request.setAttribute()怎么用的?
  7. mysql server 6.0_MySQL Server 6.0完全卸载以及卸载中遇到的问题
  8. 打包的时候不把配置文件加进去_苹果软件打包签名原理
  9. python爬取数据库数据类型_python中从搭建Mysql平台到爬取数据一站式全部完成
  10. css3中插入地图,CSS3 地图展开动画