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;
    }
    

      

      

  • 相关阅读:
    java mail 读取邮件列表,
    java itext 报错 com.itextpdf.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H'
    shiro 标签
    idea maven 创建webapp项目没有src目录
    is not allowed to connect to this MySQL server解决办法
    mybatis 插入数据并返回主键值
    idea15 生成mybatis代码
    android 打开新窗口
    Java开发笔记(八十四)文件与目录的管理
    Java开发笔记(八十三)利用注解技术检查空指针
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4471084.html
Copyright © 2011-2022 走看看