<题目链接>

题目大意:

给你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. 【MySql】join操作

    飞机票 飞机票 加油 INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN( ...

  2. Confluence 6 配置站点主页面

     主面板(dashboard)是你站点的默认主页,但是你也可以选择使用一个空间的主页为网站访问的首页面. 针对你的 Confluence 站点主要是为用户进行阅读而不是创建内容的话,这样的配置就显得非 ...

  3. Confluence 6 修改你站点的外观和感觉

    你可以为你的 Confluence 整个站点修改表现以及外观和感觉,也可以为单独的空间进行修改. 对整个站点进行的修改将会对使用全局外观和感觉(look and feel)的空间一并进行修改.如果某个 ...

  4. linux 下安装vscode

    下载安装包 https://code.visualstudio.com/docs/?dv=linux64_deb (注意是deb包) sudo dpkg -i code_1.18.1-15108573 ...

  5. centos7.5上一步步部署jumpserver

    1.基础环境:centos7.5:关闭防火墙和selinux 2.修改字符集,否则可能会报input/output error 的问题,因为日志里打印了中文 [root@xzw ~]# localed ...

  6. springboot多环境(dev、test、prod)配置

    propertiest配置格式在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如: ...

  7. java 多线程中的锁的类别及使用

    目前在Java中存在两种锁机制: synchronized Lock Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea. 数据同步需要依赖锁,那锁的同步又依赖谁? ...

  8. servlet保存会话数据---利用隐藏域

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletExcep ...

  9. 根据id查询所有子节点/父节点,mysql 以及ssm前后台处理流程

    1.所示案例数据表结构设计如下所示: 2.案例数据如下所示: 3.mysql查询语句可以查询出父级目录信息: 注意:自己的数据表表名称,切记手动修改,字段名称(特别注意id,parent_id字段名称 ...

  10. 用ArcMap打开MXD文件报One or more layers failed to draw错误!

    错误信息: One or more layers failed to draw: FDO error: 0General function failure [PW_X]参数不足,期待是 1. 原因: ...