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

    概要:

    进行拓扑排序是从入度为0的入手依次排序。

    无等于条件排序

    直接进行拓扑排序
    

    含等于条件排序

    先对等于条件进行并查集合并然后拓扑排序,且排序的时候注意存边时存的是父节点(需要Find一下)
    

    模板:

    vector建图

    const int maxn = 3e4+10;
    int deg[maxn];
    vector<int>edge[maxn];
    int f[maxn];
    int n,m,cnt=0,tt=0;
    void topo()
    {
        queue<int>q;
        while(!q.empty())q.pop();
        for(int i=0;i<n;++i){
            if(!deg[i]){
                q.push(i);
    //            --deg[i];
            }
        }
        while(!q.empty()){
            int now=q.top();q.pop();
    //        f[cnt]=now;++cnt;
            for(auto i:edge[x]){
                --deg[i];
                if(!deg[i]){
                    q.push(i);
    //                --deg[i];
                }
            }
        }
    
    }
    int main()
    {
            for(int i=0;i<n;++i){
                deg[i]=0;
                edge[i].clear();
            }
            string tmp1,tmp2;
            for(int i=1;i<=m;++i){
                cin>>tmp1>>tmp2;
                edge[mt[tmp1]].push_back(mt[tmp2]);//建边tmp1->tmp2
                ++deg[mt[tmp2]];//tmp2的入度+1
            }
            topo();
        }
    }
    

    领接矩阵建图

    void topo()
    {
        queue<int>q;
        for(int i=0;i<n;++i){
            if(!deg[i]){
                q.push(i);
                --deg[i];
            }
        }
        
        while(!q.empty()){
            int x=q.front();q.pop();
            for(int i=0;i<n;++i){
                if(!mt[x][i]) continue;//无此边
                --deg[i];
                if(!deg[i]){
                    q.push(i);
                    --deg[i];   
                }
            }
        }
    }
    
    int main()
    {
        tt{
            cin>>x>>y;
            if(mt[x][y]) continue;
            mt[x][y]=1;
            ++deg[y];
        }
    }
    
    void topo()
    {
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                if(mt[i][j]) ++deg[j];
            }
        }
        
        for(int i=0;i<n;++i){
            int k=1;
            while(deg[i]!=0)++k;
            ans[i]=k;
            --deg[k];
            for(int j=1;j<n;++j){
                if(mt[k][j])
                    --deg[j];
            }
        }
    }
    
  • 相关阅读:
    微信小程序之自定义toast弹窗
    NPOI 设置导出的excel内容样式
    NPOI excel导出快速构建
    GridView 基本使用
    jqgrid 各种方法参数的使用
    经典SQL语句大全
    jqgrid 加载时第一页面只显示多少条数据
    sqlserver2008 调试存储过程
    jqgrid 上移下移单元格
    jgrid 选择器 C#控件
  • 原文地址:https://www.cnblogs.com/waryan/p/12844448.html
Copyright © 2011-2022 走看看