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