• 图论--拓扑排序--判断一个图能否被拓扑排序


    拓扑排序的实现条件,以及结合应用场景,我们都能得到拓扑排序适用于DAG图(Directed Acyclic Graph简称DAG)有向无环图, 根据关系我们能得到一个线性序列,实现的方式是DFS,具体的实现原理,我们将在下一篇博客中讲解。

    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    using namespace std;
    const int maxn=100+10;
    int n,m;
    vector<int> G[maxn];//G[i]表示i节点所指向的所有其他点
    int in[maxn];//节点入度
    bool topo()//判断该图是否可拓扑排序
    {
        queue<int> Q;
        int sum=0;//记录可拆解的点数目
        for(int i=0;i<n;i++)if(in[i]==0)
            Q.push(i);
        while(!Q.empty())
        {
            int u=Q.front(); Q.pop();
            sum++;
            for(int i=0;i<G[u].size();i++)
            {
                int v=G[u][i];
                if(--in[v]==0) Q.push(v);
            }
        }
        return sum==n;//可完全拓扑
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)==2&&n)
        {
            memset(in,0,sizeof(in));
            for(int i=0;i<n;i++) G[i].clear();
            for(int i=0;i<m;i++)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                G[u].push_back(v);
                in[v]++;
            }
            printf("%s
    ",topo()?"YES":"NO");
        }
        return 0;
    }
  • 相关阅读:
    线程池及其原理和使用
    多线程通信Queue
    Condition实现线程通信
    守护线程和锁
    习题 7:更多的打印
    习题 6:字符串和文本
    习题 5:更多的变量和打印
    习题 4:变量和命名
    习题 3:数字和数学计算
    习题 2:注解和#号
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798575.html
Copyright © 2020-2023  润新知