標籤:拓撲排序 逆序輸出
http://acm.hdu.edu.cn/showproblem.php?pid=4857
思路--優先隊列+反向拓撲+逆序輸出
把受限制條件多的先彈出到數組裡,然後再彈出不受限制的(用優先隊列按序號從大到小),最後逆序輸出。
#include<cstdio>#include<queue>#include<vector>#include<cstring>using namespace std;#define N 30001int n,in[N],num[N],cnt;vector<int>v[N];priority_queue<int,vector<int>,less<int> >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<v[w].size();i++) { in[v[w][i]]--; if(in[v[w][i]]==0) q.push(v[w][i]); } }}int main(){ //freopen("a.txt","r",stdin); int t,m,x,y; scanf("%d",&t); while(t--) { init(); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); v[y].push_back(x); in[x]++; } top_sort(); printf("%d",num[cnt-1]); //逆序輸出 for(int i=cnt-2;i>=0;i--) printf(" %d",num[i]); printf("\n"); } return 0;}
hdu-4857 逃生 拓撲排序