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

    拓扑排序是对ADG(有向无环图进行线性排序)

    模板:

    二维数组模拟链表

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int indegree[100];
    queue<int> q;
    int n,m;
    bool map[100][100];
    int a[100];
    int topo(int n)
    {
        int cnt = 1;
        while(!q.empty())
            q.pop();
        for(int i = 1; i <= n ; i++)
            if(indegree[i] == 0)
                q.push(i);
        int u;
        while(!q.empty()){
            u = q.front();
            a[cnt++] = u;
            q.pop();
            for(int i = 1; i <= n ; i++){
                if(map[u][i]){
                    indegree[i] --;
                    if(indegree[i] == 0)
                        q.push(i);
                }
            }
            if(cnt == n){
                for(int i = 1 ; i <= n ; i++)
                    printf(" %d",a[i]);
            }
            else printf("The network has a cycle");
        }
    }
    int main()
    {
        int u,v;
        while(~scanf("%d%d",&n,&m)){
            memset(indegree,0,sizeof(indegree));
            memset(map,0,sizeof(map));
            for(int i = 0 ; i < m ; i++){
                scanf("%d%d",&u,&v);
                if(!map[u][v])
                    indegree[v]++;
                    map[u][v] = 1;
            }
                   topo(n);
        }
        return 0;
    }
    

      

    邻接表实现

    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    const int M = 100005;
    int a[M];
    int indegree[M];
    int n,m,u,v;
    vector<int> G[M];
    void topo()
    {
        memset(indegree,0,sizeof(indegree));
        memset(a,0,sizeof(a));
        for(int i = 1; i <= n ; i++){
            for(int j = 0 ; j <= G[i].size(); j++){
                indegree[G[i][j]]++;
            }
        }
        queue<int> q;
        while(!q.empty())
            q.pop();
        int cnt = 1;
        for(int i = 1;i <= n ; i++){
            if(!indegree[i])
                q.push(i);
        }
        while(!q.empty()){
            int u = q.front();
            q.pop();
            a[cnt++] = u;
            for(int i = 0 ; i <G[u].size(); i++){
                int v = G[u][i];
                indegree[v]--;
                if(!indegree[v])
                    q.push(v);
            }
        }
        if(cnt == n){
            for(int i = 1; i < cnt; i++)
                printf(" %d", a[i]);
            printf("%d
    ",a[cnt]);
        }
        else printf("This is a cycle
    ");
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m)){
         for(int i = 1; i <= n ; i++)
          G[i].clear();
            for(int i = 1; i <= m ; i++){
                scanf("%d%d",&u,&v);
                G[u].push_back(v);
            } 
            topo();
        }
        return 0;
    }
    

      

      

  • 相关阅读:
    读spring Micro-Service tats收获
    读spring Micro-Service tats收获
    读spring Micro-Service tats收获
    读Software Entity Architektur收获
    读Software Entity Architektur收获
    读Software Entity Architektur收获
    mvc案例
    11.16
    11.15
    11.13
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4471084.html
Copyright © 2011-2022 走看看