<题目链接>

题目大意:

给你N个点(编号从0到N-1)和M个关系,要你判断这个图的所有点的顺序是否可以全部确定.不过对于任意点的关系可能存在A>B或A<B或A=B三种情况,如果A=B的话,那么就比较他们的编号,编号大的点分数大.(即两点之间关系如果相等,它们之间的排序也可以确定).

解题分析:

本题要处理等于的情况,单纯的拓扑排序不好处理,  因为这些等于的点与其点的关系是相同的,所以用并查集将这些等于的点进行缩点。当然,在判断冲突的时候,也要考虑到,这些等于的点之间是否会产生冲突,比如开始声明 A=B ,而后面的声明又推出A>B的结论,这种情况显然是不行的,然后就是用拓扑排序判断当前所有点是否冲突和判断是否能够确定唯一的序列。判断冲突的依据其实就是判断图中是否存在环,这个直接根据拓扑排序中依次展开成入度为0的点的个数是否等于总的点数即可,因为如果存在环,那么环中的点无论如何也不可能展开成入度为0的点。判断拓扑排序展开后的序列是否唯一则是根据拓扑排序过程中是否在同一时刻有多个入度为0的点来判断。

 #include <cstdio>
 #include <cstring>
 #include <queue>
 #include <algorithm>
 using namespace std;
 ;
 ;
 int n,m,tot;
 int fa[N],ind[N],head[N];
 ];
 int a[M],b[M];
 struct Edge{
     int to,next;
 }edges[M];
 void addedge(int u,int v){
     edges[++tot].to=v,edges[tot].next=head[u];
     head[u]=tot;ind[v]++;
 }
 int find(int i){
     ) return i;
     return fa[i]=find(fa[i]);
 }
 int toposort(){
     queue<int> Q;
     ;   //连通分量根数目
     ;   //入度为0且从Q出队列的点数
     bool order=true;  //判断排列是否唯一
     ;i<n;i++)if(find(i)==i){
         scc++;
         ) Q.push(i);   //让入度为0的根节点进入队列
     }
     while(!Q.empty()){
         ) order=false;  //如果队列中同时又多个入度为0的点,则说明该图不能确定唯一的排序
         int u=Q.front();Q.pop();
         cnt++;
         ;i=edges[i].next){
             int v=edges[i].to;
             )
                 Q.push(find(v));    //入度为0的点入队列
         }
     }
     ;  //如果在拓扑排序中,入度为0的"点"数<所有的"点"数,说明该图中必然有环,存在冲突
     ;     //可确定唯一排序
     ;               //即不冲突,又不可确定唯一的排序
 }
 int main(){
     while(~scanf("%d%d",&n,&m)){
         memset(head,-,sizeof(head));
         memset(fa,-,sizeof(fa));
         memset(ind,,sizeof(ind));
         tot=;
         ;          //判断结果的状态
         ;i<m;i++){        //将所有具有等于关系的进行缩点
             scanf("%d%s%d",&a[i],str[i],&b[i]);
             ]=='='){
                 int u=a[i], v=b[i];
                 u=find(u), v=find(v);
                 if(u!=v) fa[u]=v;    //用并查集进行缩点
             }
         }
         ;i<m;i++){    //添加有向边,且判断"点"中是否冲突
             int u=a[i], v=b[i];
             ]!='='){     //判断该缩点后的"点"中是否存在冲突
                 ans=-;         //冲突
                 break;
             }
             ]=='<')      addedge(find(v),find(u));   //添加有向边
             ]=='>') addedge(find(u),find(v));
         }
         ) ans=toposort();
         ) printf("CONFLICT\n");
         ) printf("UNCERTAIN\n");
         ) printf("OK\n");
     }
 }

2018-11-20

HDU 1811 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. Rank of Tetris 拓扑排序+并查集

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

  5. hdu 1811 Rank of Tetris (拓扑 & 并查集)

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

  6. HDU 1811 拓扑排序 并查集

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

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

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

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

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

  9. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)

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

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

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

随机推荐

  1. swift 实践- 02 -- 自定义cell 的简单使用

    import UIKit class MyTableViewCell: UITableViewCell { var imageV: UIImageView? var titleLabel: UILab ...

  2. java基础编程题练习(一)

    1.编程实现用户输入4个整数,按从大到小的顺序排列输出. 思路:将输入的数据存入数组,使用冒泡排序对数组数据进行排序后输出数组 冒泡排序的代码如下: import java.util.Scanner; ...

  3. Oracle 中 nvl、nvl2、nullif、coalesce、decode 函数的用法详解

    NVL(EXPR1,EXPR2) NVL2(EXPR1,EXPR2,EXPR3) NULLIF(EXPR1,EXPR2) COALESCE(EXPR1,,..,EXPRn) decode ------ ...

  4. 处理数据库 Ora-00845: memory_traget not supported on this system 的错误

    问题出现情况:在数据库启动的时候:如果出现如下图的错误: 查看官方文档: 处理操作步骤: [oracle@localhost orcl]$ su - root Password: [root@loca ...

  5. Confluence 6 注册外部小工具

    你可以从外部站点中注册小工具(Gadget)(例如 Jira 应用),你注册成功的小工具将会在 宏浏览器中显示出来,使用你 Confluence 站点的用户可以使用 Gadget Macro 来调用它 ...

  6. python之内置模块random(转载)

    转载自http://www.cnblogs.com/wcwnina/p/9281334.html random.seed(a=None, version=2) # 初始化伪随机数生成器,若种子a相同, ...

  7. nginx+php负载均衡集群环境中的session共享方案梳理

    在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...

  8. package.json包描述文件说明

    //commonjs包规范-说明 { "name": "leyi",//包名,不允许空格 "description": "hell ...

  9. laravel 迁移枚举

    $table->enum('type', ['replace', 'warning'])->comment('类型');

  10. ajax对象方法的使用

    change.js文件的内容对象函数关键字:fnjQuery.fn.change = function () { this.css({"background": "red ...