HDU1811 拓扑排序判环+并查集

HDU Rank of Tetris

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1811

题意:中文问题就不解释题意了。

这道题其实就是一个拓扑排序判圈,我的博客里面其他几篇拓扑排序判圈的套路一样。但是这道题与他们不同的的是在大小关系里面存在一种 “=”的关系,这就意味的那些序号不同的点,实际上是一个点。共享入度和出度。我们可以通过并查集将他们合并,合成一个点。这里说一下如何判断信息不完全。我们早先在做拓扑排序,多种排列方式的时候,按照字典序输出。我们建立一个优先队列,维护字典序,这个时候堆里是有很多元素的,我们通过优先队列取出最小或者最大,实际上这些元素在拓扑排序中是等价关系,也就是说他们之间的大小关系无法比较。在这道题中,如果滞留在队列中的元素超过一个说明有两个元素无法比较的,就说明了答案是UNCLEARED。直接看代码吧!,具体细节写在注释里面了。

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=10000+10;
using namespace std;
typedef long long LL;
vector<int>p[N];
int f[N];
int in[N];
struct node{
    int x,y;
    char ch;
}oj[N];
 int n,m;
int ct=0,flag=0;
//并查集套路
int Find(int x){
    return f[x]==x?x:f[x]=Find(f[x]);
}
void topo(){
    queue<int>q;
    while(!q.empty()) q.pop();
    for(int i=0;i<n;i++) if(!in[i]&&Find(i)==i) q.push(i);//首先得是并查集中的根,然后出度为0
    while(!q.empty()){
        if(q.size()>1) flag=1;//同级元素大于一个说明有至少有两个元素无法比较,所以信息不完全
        int t=q.front();q.pop();
        ct++;
        for(int i=0;i<p[t].size();i++){
            int tmp=p[t][i];
            if(--in[tmp]==0) q.push(tmp);
        }
    }
    if(ct!=n) cout<<"CONFLICT"<<endl;
    else if(flag) cout<<"UNCERTAIN"<<endl;
    else cout<<"OK"<<endl;
}
int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    while(cin>>n>>m){
        for(int i=0;i<n;i++) f[i]=i;
        memset(in,0,sizeof(in));
        for(int i=0;i<n;i++) p[i].clear();
        int x,y;
        ct=flag=0;
        //先处理‘=‘带来的点的减少,建立并查集缩点
        for(int i=0;i<m;i++){
            cin>>oj[i].x>>oj[i].ch>>oj[i].y;
            if(oj[i].ch==‘=‘){
                x=Find(oj[i].x);
                y=Find(oj[i].y);
                if(x!=y) {f[x]=y;ct++;}//缩点了别忘了ct++,因为相当于总点数减少了一个
            }
        }
        //根据缩完点的点边关系,反向建图(正向建图也可以)
        for(int i=0;i<m;i++){
            if(oj[i].ch==‘=‘) continue;
            x=Find(oj[i].x);
            y=Find(oj[i].y);
            if(oj[i].ch==‘>‘){
                p[y].push_back(x);
                in[x]++;
            }
            else{
                p[x].push_back(y);
                in[y]++;
            }

        }
        //并查集处理完建图之后就是常规的拓扑排序
        topo();
    }
    return 0;
}

在最小生成树的克鲁斯卡尔算法里,并查集被用来判断是否形成环路,正如我在我的其他几份博文里面说的那样,我认为在一个图中,如果出现环,那么环可以缩成一个点。环上的点实际上是等价的,也就是说并查集实际上是通过边的关系,说明两个不同的点,合并成一个点,通过一个根共享他们的信息。a=b全等价于a>b,a<b这样两条边。我们根据这个信息把a,b合并。通过一个根可以是a,也可以是b来查询这个整体的信息。总结一句并查集就是把一些不同的东西合并在一起,一起查询的工具。

时间: 2024-11-05 20:48:49

HDU1811 拓扑排序判环+并查集的相关文章

Legal or Not(拓扑排序判环)

http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5788    Accepted Submission(s): 2678 Problem Description ACM-DIY is a large QQ group w

LightOJ1003---Drunk(拓扑排序判环)

One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So, one day I was talking to him, about his drinks! He began to describe his way of drinking. So, let me share his ideas a bit. I am expressing in my wo

HDU 3342 Legal or Not(拓扑排序判环)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 题目: Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many "holy cows" like HH, hh, AC, ZT, lc

拓扑排序判环

拓扑排序的核心就是每次找入度为0的点,进入输出队列 ,然后将与此点相连的节点入度减1重复做以上操作.当做n-1 次后还有点没进输出队列 那么这些点就是环上的 因为环上的各点入度都为1 没有0的 就不能更新.也就是说拓扑排序一遍之后,如果是DAG所有点都恰好入队一次如果有环,那么一定存在没有入队的点. 例题: Legal or NotTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pr

[拓扑排序][DP][Tarjan][并查集]JZOJ 4253 QYQ在艾泽拉斯

Description 在艾泽拉斯的无尽之海里,有着一群不为人知的由各个种族的冒险者统治的岛屿,这些岛屿都很庞大,足以在上面建造许多的城市,城市之间有一些单向道路连接.有一天,QYQ无意中发现了这些岛屿,并且发现在每个城市的地下都或多或少埋藏着一些装备.金币.宝物……可是正当QYQ兴奋不已打算全部把它们拿走时,他却惊奇的发现你的魔法在这里被限制住了,唯一可用的技能就是闪现,而且魔法只够他使用K次这个技能了,每次使用这个技能QYQ只能从一个岛屿上闪现到另外一个岛屿上.每一个岛屿只能登上一次,QYQ

[hiho1174]拓扑排序一(拓扑排序判环)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选什么课么? 小Hi:挺多的,比如XXX1,XXX2还有XXX3.本来想选YYY2的,但是好像没有先选过YYY1,不能选YYY2. 小Ho:先修课程真是个麻烦的东西呢. 小Hi:没错呢.好多课程都有先修课程,每次选课之前都得先查查有没有先修.教务公布的先修课程记录都是好多年前的,不但有重复的信息,好像很多都不正确了. 小Ho:课程

Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)

Almost Acyclic Graph CodeForces - 915D time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a directed graph consisting of n vertices and m edges (each edge is directed, so it can

POJ 1094 Sorting It All Out(拓扑排序判环)

题目链接:http://poj.org/problem?id=1094 题目: Description An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D

HDU 4324 Triangle LOVE(拓扑排序判环)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4324 题目: Problem Description Recently, scientists find that there is love between any of two people. For example, between A and B, if A don’t love B, then B must love A, vice versa. And there is no possi