<题目链接>

题目大意:

给你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. list_test

    #! -*- coding:utf-8 -*-"""len() ,len(list)方法返回列表元素个数,list -- 要计算元素个数的列表,返回值,返回列表元素个数元 ...

  2. Confluence 6 基本性能问题诊断步骤

    基本性能问题诊断步骤 开始下面的程序: 进入 Troubleshooting Confluence hanging or crashing页面找到已知的主要性能问题. 进行页面 Performance ...

  3. <a>之间怎么放值</a> 挺简单的,第一次遇到···

    需求描述:对列表中的某一列内容添加a标签(其实就是对td标签下添加a标签了). 思路简介:拿到这个我首先的反应就是在td标签对text获取内容的代码中动态拼接<a></a>字符 ...

  4. lightoj1234 打表技巧:分块打表

    /* 打不了那么大的表,所以只记录分块的信息即可 */ #include<bits/stdc++.h> using namespace std; #define maxn 1000005 ...

  5. Linux/Unix/Mac OS下的远程访问和文件共享方式

    scp -P 20022 src.tar.gz zhouhh@192.168.12.13:/home/zhouhhscp -P 20022 zhouhh@192.168.12.13:/home/zho ...

  6. linux ssh远程免密码登入

    首先登入一台linux服务器,此台做为母机(即登入其他linux系统用这台做为入口):执行一行命令生成key文件:ssh-keygen -t rsa 2 在母机上,进入/roo/.ssh目录,找到id ...

  7. C++ Primer 笔记——迭代器

    iostream迭代器 1.虽然iostream类不是容器,但是标准库定义了可以用于IO的迭代器.创建一个流迭代器的时候必须指定要读写的类型.我们可以对任何具有输入运算符(>>)的类型定义 ...

  8. IDEA复制项目操作

  9. Just oj 2018 C语言程序设计竞赛(高级组)D: 四边形面积

    D: 四边形面积 时间限制: 1 s      内存限制: 128 MB      提交 我的状态 题目描述 有一个四边形,现在需要求它的面积 输入 输入四行,每行两个数整数xx, yy (1≤x,y ...

  10. 51 NOd 2006 飞行员配对(匈牙利算法二分匹配)

    题目来源: 网络流24题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏  关注 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一 ...