vijos1790

注意要建反图,走逆向拓扑序

若正向无法保证在当前最有的情况下,是否全局最有,而反向则满足

#include<cstdio>
#include<cctype>
#include<queue>
using namespace std;
int n,m,indg[100002],head[100002],to[200002],nex[200002],cnt,id[100002];
priority_queue<int>q;

inline void read(int &x){
    char ch=getchar();x=0;
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
}

inline void addedge(int u,int v){
    indg[v]++;to[++cnt]=v;nex[cnt]=head[u];head[u]=cnt;
}

int main(){
    read(n);read(m);
    while(m--){
        int u,v;read(u);read(v);u--;v--;
        addedge(v,u);
    }
    int tot=n;
    for(int i=0;i<n;i++)if(indg[i]==0)q.push(i);
    while(!q.empty()){
        int now=q.top();q.pop();
        id[now]=tot--;
        for(int i=head[now];i;i=nex[i])if((--indg[to[i]])==0)q.push(to[i]);
    }
    for(int i=0;i<n;i++)if(indg[i]>0)id[i]=tot--;
    for(int i=0;i<n;i++)printf("%d ",id[i]);
}
原文地址:https://www.cnblogs.com/MikuKnight/p/8981153.html