cqm解题报告03

来源:互联网 发布:手机申请域名 编辑:程序博客网 时间:2024/05/24 05:04

这题现场的时候我看了一眼感觉是个并查集就跳过,,赛后发现这是个拓扑排序,,于是学了波。。这题用拓扑做,如果构成了环表示不能构成拓扑排序,即题意中的记错了。
下面附上代码。

#include<iostream>#include<cstdio>#include<queue>#include<algorithm>#include<cstring>using namespace std;const int maxn=1e5+10;int vis[maxn];vector<int> g[maxn];int n,m;int flag;void dfs(int x,int t){    if(vis[x]==t)    {//这个点之前已经访问过这个时间点了      //所以成环不能构成拓扑序了        flag=0;        return ;    }    if(vis[x])return ;//如果当前前访问过了    vis[x]=t;    int N=g[x].size();    for(int i=0;i<N;i++)    {        dfs(g[x][i],t);    }}bool topo_sort(){    int t=0;    flag=1;    for(int i=1;i<=n;i++)    {        if(!vis[i])        {            t++;            dfs(i,t);            if(flag==0)return false;        }    }    return true;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=1;i<=n;i++)        {            g[i].clear();        }        memset(vis,0,sizeof(vis));        for(int i=1;i<=m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            g[a].push_back(b);        }        if(topo_sort())//构成拓扑排序        {            printf("No\n");//没记错        }else{            printf("Yes\n");        }    }}
0 0