zoukankan      html  css  js  c++  java
  • 模板|拓扑排序

    拓扑排序

    必须是有向图;
    先计算入度,把入度为0的点加入队列,每次从队列拿出一个入度为0的点,去除这条边(与这条边相连的点的入度-1),出现新的入队为0的点就入度,直到队列为空。

    #include <iostream>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int MAX_N = 100;
    const int MAX_M = 10000;
    struct edge {
        int v, next;
        int len;
    } E[MAX_M];
    int p[MAX_N], eid;
    void init() {
        memset(p, -1, sizeof(p));
        eid = 0;
    }
    void insert(int u, int v) {
        E[eid].v = v;
        E[eid].next = p[u];
        p[u] = eid++;
    }
    
    int n,m;
    int indegree[MAX_N];
    
    void topo(){
        queue<int> q;
        for(int i=1;i<=n;i++){
            if(indegree[i] == 0){
                q.push(i);
            }
        }
        while(!q.empty()){
            int now = q.front();
            cout<< now <<endl; //打印拓扑序列
            q.pop();
            for(int i=p[now];i!=-1;i = E[i].next){
                int v = E[i].v;
                indegree[v]--;
                if(indegree[v] == 0){
    				q.push(v);
                }
            }
        }
        
    }
    
    int main() {
        init();
        memset(indegree,0,sizeof(indegree));
        cin>>n>>m;
        for(int i=0;i<m;i++){
            int u,v;
            cin>>u>>v;
            insert(u,v);
            indegree[v]++;
        }
        topo();
        return 0;
    }
    

    应用1:拓扑排序用来检测是否有环。

  • 相关阅读:
    python每日作业4/21
    socket实现并发之socketserver模块的使用
    python socket粘包问题的解决
    每日作业:4/20
    网络编程基础(socket)
    网络基础之网络协议
    异常处理
    python 作业4/15
    centos7简单安装配置mariadb
    Centos7下Firewalld防火墙配置命令
  • 原文地址:https://www.cnblogs.com/fisherss/p/10683847.html
Copyright © 2011-2022 走看看