Kattis-Chess Tournament(有向图判环)

题目链接:点击打开链接

题目大意:
给定一些标号,与标号之间的大小关系,判断所有给出的关系是否能同时成立。
解题思路:
其实看到题目就觉得是一个判断是否存在环的问题,但是有点区别就是点与点之间可以有相等的关系,这样的话就貌似不好直接判环:我当时是想非等于关系用单向边连接,而相等关系用双向边连接,然而实际上没什么卵用,等于关系直接成环了...。后面看了标程才知道自己的理解还是很肤浅啊:相等的关系其级别相同,那么我们把所有在同一个级别的点标一个编号,把所有的点重新标号后,根据原来点与点之间的关系在新的编号之间连边。假如有这样的一些关系:1=2=3=4,5=6=7,2>5,3>7,6>2,首先编号:(1,2,3,4)在一个级别,编号为1,(5,6,7)在一个级别,标号为2,则2>5,3>7,6>2 分别为1->2,1->2,2->1,其他情况以此类推。可以想到这样建成的一个新的图,就可以直接进行判环了。
代码:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=5e4+10;
vectorequ[maxn];
vectorgre[maxn];
vectorGra[maxn];
int vis[maxn];
int Newlv[maxn];
int n,m;
void Getlv(int u,int lv){
    if(vis[u])return;
    Newlv[u]=lv;
    vis[u]=1;
    int sz=equ[u].size();
    for(int i=0;i>n>>m;
    for(int i=0;i>x>>ch>>y;
        if(ch=='='){
            equ[x].push_back(y);
            equ[y].push_back(x);
        }
        else gre[x].push_back(y);
    }
    int lv=0;
    for(int i=0;i

其实做这个题以前并没有很仔细地去看拓扑排序,然后每次就直接抄模板。大概看了题解之后,就直接DFS去搜了一遍——WA...,然后想想才明白有向图判环和无向图判环的区别:一个可以重复搜到同一个点,只要这个点已经出栈了;一个只要搜到同一个点,就可以判断有环。

你可能感兴趣的:(图论,图论,判环)