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

    对于初始没有进行编号,且要求数字小的尽可能在前面
    需要进行反向拓扑排序

    真的看不懂
    反正需要进行
    邻接表优化
    传送门
    传送门

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int N = 3e4+5;
    int n,m,cnt;
    bool mp[N][N];
    int du[N],head[N];
    int a[N];
    struct P{
        int to,nxt;
    }e[N];
    void add(int u,int v){
        e[cnt].to=v;
        e[cnt].nxt=head[u];
        head[u]=cnt++;
    }
    void topsort(){
        int k=n;
        priority_queue<int>q;
        for(int i=1;i<=n;i++) if(!du[i]) q.push(i);
        while(!q.empty()){
            int tmp=q.top();
            q.pop();
            a[tmp]=k--;
            for(int i=head[tmp];~i;i=e[i].nxt){
                int v=e[i].to;
                du[v]--;
                if(!du[v]) q.push(v);
            }
        }
        if(k!=0) printf("-1
    ");
        else{
            for(int i=1;i<=n;i++)
                printf("%d%c",a[i],i==n?'
    ':' ');
        }
    }
    void init(){
        memset(mp,0,sizeof(mp));
        memset(a,0,sizeof(a));
        memset(head,-1,sizeof(head));
        memset(du,0,sizeof(du));
        cnt=0;
    }
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            init();
            scanf("%d%d",&n,&m);
            while(m--){
                int x,y;
                scanf("%d%d",&x,&y);
                if(mp[x][y]==1) continue;//重边
                mp[x][y]=1,add(y,x);//反向边
                du[x]++;
            }
            topsort();
        }
        return 0;
    }
    
  • 相关阅读:
    POJ2184 01背包变形 xingxing在努力
    HDU2955 01背包变体 xingxing在努力
    Uva624 01背包输出方案 xingxing在努力
    HDU2602 01背包 xingxing在努力
    Jersey初谈
    Jersey初谈
    Oracle基本语句
    Oracle基本语句
    2013下半年工作总结
    2013下半年工作总结
  • 原文地址:https://www.cnblogs.com/Emcikem/p/12013207.html
Copyright © 2011-2022 走看看