標籤:
拓撲排序+堆。
轉自popoqqq神犇。
反向建圖跑拓撲排序然後逆序輸出。
為什麼不能正的來呢,因為不知道選當前菜要先製作哪種菜。
逆序過來跑拓撲的話,也能保證滿足限制條件編號小的在前面。
題外話:我都打完了才發現第三個範例輸出不對,一看題直接就棄療了。。事實證明就改動幾個字母。。。。
toposort我一直喜歡叫”土撥”sort,可能是因為我口語不好吧。。。
#include<cstdio>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int maxn = 100000 + 10;const int maxm = 200000 + 10;priority_queue<int> q;int res[maxn],cnt;int g[maxn],v[maxm],next[maxm],in[maxn],eid;int T,n,m,u;void addedge(int a,int b) { v[eid]=b; next[eid]=g[a]; g[a]=eid++; in[b]++;}int main() { scanf("%d",&T); while(T--) { memset(g,-1,sizeof(g)); eid=0; scanf("%d%d",&n,&m); cnt=0; for(int i=1,a,b;i<=m;i++) { scanf("%d%d",&a,&b); addedge(b,a); } for(int i=1;i<=n;i++) if(!in[i]) q.push(i); while(!q.empty()) { u=q.top(); q.pop(); for(int i=g[u];~i;i=next[i]) { in[v[i]]--; if(!in[v[i]]) q.push(v[i]); } res[++cnt]=u; } if(cnt<n) printf("Impossible!\n"); else { for(int i=n;i>=1;i--) printf("%d ",res[i]); printf("\n"); } } return 0; }
4010: [HNOI2015]菜肴製作