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
 
 
 
冲突:通过判环来判断
信息不完全:通过判断队列元素是否大于一来判断
= 用并查集来判断   连在一起即可  记得cnt要加一 
 
 
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //input by bxd
  4. #define rep(i,a,b) for(int i=(a);i<=(b);i++)
  5. #define repp(i,a,b) for(int i=(a);i>=(b);--i)
  6. #define RI(n) scanf("%d",&(n))
  7. #define RII(n,m) scanf("%d%d",&n,&m)
  8. #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
  9. #define RS(s) scanf("%s",s);
  10. #define ll long long
  11. #define pb push_back
  12. #define REP(i,N) for(int i=0;i<(N);i++)
  13. #define CLR(A,v) memset(A,v,sizeof A)
  14. #define inf 0x3f3f3f3f
  15. //////////////////////////////////////
  16. const int N=+;
  17. int f[N];
  18. int find1(int x)
  19. {
  20. return x==f[x]?x:f[x]=find1(f[x]);
  21. }
  22. int in[N];vector<int>edge[N];
  23. void union1(int a,int b)
  24. {
  25. int x=find1(a);
  26. int y=find1(b);
  27. if(x!=y)
  28. f[x]=y;
  29. }
  30. struct node
  31. {
  32. int a,b;
  33. char s[];
  34. }s[N];
  35.  
  36. int main()
  37. {
  38. int n,m;
  39.  
  40. while(~RII(n,m))
  41. {
  42. rep(i,,n)f[i]=i;
  43. int cnt=;
  44. rep(i,,m)
  45. {
  46. RI(s[i].a);RS(s[i].s);RI(s[i].b);
  47. if(s[i].s[]=='=')
  48. {
  49. int x=find1(s[i].a);
  50. int y=find1(s[i].b);
  51. if(x!=y)//一定要进行判断!!1因为这个wa了一发
  52. cnt++,f[x]=y;
  53. }
  54. }
  55.  
  56. int conf=;
  57. int unkonw=;
  58. rep(i,,m)
  59. {
  60. if(s[i].s[]=='=')continue;
  61. int x=find1(s[i].a);
  62. int y=find1(s[i].b);
  63. if(x==y)conf=;
  64. if(s[i].s[]=='>')
  65. {
  66. in[y]++;
  67. edge[x].pb(y);
  68. }
  69. else
  70. {
  71. in[x]++;
  72. edge[y].pb(x);
  73. }
  74. }
  75. queue<int>q;
  76. rep(i,,n-)
  77. if(f[i]==i&&!in[i])//那些和他并在一起的都已经被抹杀了 所以要f[i]==i
  78. q.push(i);
  79. while(!q.empty())
  80. {
  81. if(q.size()>)unkonw=;
  82. int u=q.front();q.pop();
  83. cnt++;
  84. if(edge[u].size())
  85. rep(i,,edge[u].size()-)
  86. {
  87. int x=edge[u][i];
  88. if(--in[x]==)
  89. q.push(x);
  90. }
  91. }
  92. if(cnt!=n)
  93. conf=;
  94.  
  95. if(conf)
  96. printf("CONFLICT\n");
  97. else if(unkonw)
  98. printf("UNCERTAIN\n");
  99. else printf("OK\n");
  100. rep(i,,n)in[i]=,edge[i].clear();
  101.  
  102. }
  103. return ;
  104. }

Rank of Tetris 拓扑排序+并查集的更多相关文章

  1. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  2. hdu 1811 Rank of Tetris - 拓扑排序 - 并查集

    自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...

  3. hdu1811 Rank of Tetris 拓扑排序+并查集

    这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...

  4. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  5. 拓扑排序 - 并查集 - Rank of Tetris

    Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球 ...

  6. HDU 1811 Rank of Tetris(拓扑排序+并查集)

    题目链接: 传送门 Rank of Tetris Time Limit: 1000MS     Memory Limit: 32768 K Description 自从Lele开发了Rating系统, ...

  7. Rank of Tetris(hdu1811拓扑排序+并查集)

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

  8. hdu 1811(缩点+拓扑排序+并查集)

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

  9. LA 4255 (拓扑排序 并查集) Guess

    设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...

随机推荐

  1. rest framework 序列化

    serializers 序列化组件 可以实现很轻松的互相转换,最常用的组件 ,用量最大的组件 源码位置 rest_framework.serializers 源码中需要用到的    rest_fram ...

  2. 【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  3. hdu 3480 Division(四边形不等式优化)

    Problem Description Little D is really interested in the theorem of sets recently. There’s a problem ...

  4. css实现弹出框

    弹出框也是前端里面经常使用的一个应用场景了,最开始想到的是用js实现这个效果,看到codepen上面有用css实现的.其实就是用到了css里面的一个:target选择器+visibility属性. U ...

  5. JavaScript与jQuery关于鼠标点击事件

    即实现鼠标点击其中一个菜单发生样式的改变,当点击下一个菜单时,当前菜单样式改变,其他菜单均变为之前样式. 用JavaScript,jQuery都可以实现,只是后者是封装的JavaScript库,具有s ...

  6. GO语言系列(五)- 结构体和接口

    结构体(Struct) Go中struct的特点 1. 用来自定义复杂数据结构 2. struct里面可以包含多个字段(属性) 3. struct类型可以定义方法,注意和函数的区分 4. struct ...

  7. 数据库学习之MySQL进阶

    数据库进阶   一.视图                                                                            数据库视图是虚拟表或逻辑 ...

  8. Linux grep \t Tab 键失效

    解决方法 1.'$' 有一个日志文件, 比如说有两列, 中间使用 \t制表符分割了.   则在grep查找的时候 使用: '$'\t''\+  代替我们的\t制表符 - 2.-P grep -P '\ ...

  9. GIT-Bonobo.Git.Server的使用

    GIT-Bonobo.Git.Server的使用 登录 (默认用户:admin/admin) 创建用户: 创建团队,勾选用户 创建新库 保存完成!

  10. MongoDB 3.6.9 集群搭建 - 切片+副本集

    1. 环境准备 在Mongo的官网下载Linux版本安装包,然后解压到对应的目录下:由于资源有限,我们采用Replica Sets + Sharding方式来配置高可用.结构图如下所示: 这里我说明下 ...