<题目链接>

题目大意:

给你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. Confluence 6 虚拟文件和文件夹

    在取消点赞事件中,你可能会遇到 WebDAV  客户端的问题或者不稳定的情况,你可以启用访问自动创建(虚拟)文件和文件夹. 备注: 在默认情况下,这个选项隐藏在 'WebDAV Configurati ...

  2. 第九单元 利用vi编辑器创建和编辑正文文件

    vi编辑器简介  什么是vi vi编辑器的操作模式 vi编辑器的3种基本模式 在vi编辑器中光标的移动 移动光标位置的键与光标移动间的关系 进入插入模式 从命令行模式进入插入模式的命令 在命令行模式下 ...

  3. Winhex数据恢复学习笔记(三)

    上次对文件系统进行简单的分析,这次就文件的镜像功能做一介绍 1.首先镜像的概念:镜像就是数据的副本,是原来数据在相同位置上以相同的排列模式生成的拷贝,所以镜像可以用来还原原始数据,代替原始数据工作,镜 ...

  4. Python元组与列表的区别

    列表类似于我们用铅笔在纸上写字,写错了还可以擦掉:而元组则类似于用钢笔写字,写错了就擦不掉了,除非换张纸重写. 列表和元组的区别主要体现在一下几个方面: 列表属于可变序列,他的元素可以随时修改或删除: ...

  5. mysql入门练习

    2.详细解释列mysql执行语句的每个参数与参数值的含义 ​ mysql -hlocalhost -P3306 -uroot -proot 连接数据库,端口号为3306, 用户名root, 密码roo ...

  6. Eclipse中java文件生成jar文件的方法

    在eclpse中找到你要导出的java程序 选中它   单击文件 -->export   在弹出的export对话框中找到 jar File 单击选中-->next   按图示顺序依次 选 ...

  7. 卸载列表信息——Uninstall注册表

    今天用InstallShield打包了一个安装程序,安装顺利完成了,但是当我去控制面板准备卸载时,发现我的程序没有详细的信息,正常的软件信息如下图: 而我的程序没有发布者,大小和版本,也没有图标,于是 ...

  8. 彻头彻尾理解 LinkedHashMap

    HashMap和双向链表合二为一即是LinkedHashMap.所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表的HashMap. ...

  9. 论文阅读笔记二十二:End-to-End Instance Segmentation with Recurrent Attention(CVPR2017)

    论文源址:https://arxiv.org/abs/1605.09410 tensorflow 代码:https://github.com/renmengye/rec-attend-public 摘 ...

  10. IDEA新建模块