?
思路--优先队列+反向拓扑+逆序输出
把受限制条件多的先弹出到数组里,然后再弹出不受限制的(用优先队列按序号从大到小),最后逆序输出。
#include
#include
#include
#include
using namespace std; #define N 30001 int n,in[N],num[N],cnt; vector
v[N]; priority_queue
,less
>q; //大根堆 void init() { cnt=0; for(int i=0;i<=n;i++) v[i].clear(); memset(in,0,sizeof(in)); memset(num,0,sizeof(num)); while(!q.empty()) q.pop(); } void top_sort() { for(int i=1;i<=n;i++) if(in[i]==0) q.push(i); while(!q.empty()) { int w=q.top(); q.pop(); num[cnt++]=w; for(int i=0;i
=0;i--) printf( %d,num[i]); printf( ); } return 0; }
?