zoukankan      html  css  js  c++  java
  • 拓扑排序判断有向图是否成环

        对一个有向图的节点进行拓扑排序,可以用来判断该有向图是否成环,有环则无拓扑序列,无环则有。
        

    #include <cstdio>
    #include <cstring>
    #include<iostream>
    #include <queue>
    using namespace std;
    const int maxn = 1e5 + 7;
    
    int n,m, du[maxn], head[maxn], tot,cnt,ans[maxn];
    struct node {
        int v, next;
    } edge[maxn];
    queue<int>q;
    void add(int u, int v) {
        edge[tot].v = v;
        edge[tot].next = head[u];
        head[u] = tot++;
    }
    void init() {
        tot = 0;
        memset(du, 0, sizeof(du));
        memset(head, -1, sizeof(head));
    }
    void solve() {
        while(!q.empty()) {
            int u = q.front();
            q.pop();
            ans[cnt++]=u;
            for (int i = head[u] ; i != -1 ; i = edge[i].next) {
                du[edge[i].v]--;
                if (!du[edge[i].v]) q.push(edge[i].v);
            }
        }
    }
    int main() {
    
        int x,y;
        scanf("%d",&n);
        init();
        for (int i = 1 ; i <= n ; i++) {
    
    
          while(scanf("%d",&x)!=EOF&&x!=0){
    
          add(i,x);
          du[x]++;}
        }
        for (int i = 1 ; i <= n ; i++)
            if (!du[i]) q.push(i);
        solve();
        if(cnt==m)
        {
            for(int i=0;i<cnt;i++)
                cout<<ans[i]<<" ";
            cout<<endl;
        }
        else
            cout<<"有向图成环"<<endl;
        return 0;
    }
    

  • 相关阅读:
    pymysql模块操作数据库及连接报错解决方法
    lvs负载均衡
    redis(nosql数据库)
    zabbix
    shell正则表达式
    红帽CentOS7 密码破解
    shell基础及变量符号
    xshell连接虚拟机
    散列表与哈希算法学习笔记
    LeetCode-300 最长上升子序列
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755110.html
Copyright © 2011-2022 走看看