题目:菜肴制作
思路:
拓扑排序:
注意这里不是输出字典序最小的方案。
读入时反向连边,对这张反图拓扑排序时要把队列改为优先队列,再反向输出结果。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
int n,m;
vector<int> g[maxn+5];
int du[maxn+5];
vector<int> ans;
priority_queue<int> que,emp;
void init(){
for(int i=1;i<=maxn;i++) {
g[i].clear();
du[i]=0;
}
que=emp;
ans.clear();
}
void readin(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&y,&x);
g[x].push_back(y);
du[y]++;
}
}
void toposort(){
for(int i=1;i<=n;i++) {
if(!du[i]) que.push(i);
}
while(!que.empty()){
int x=que.top();
que.pop();
ans.push_back(x);
for(int i=0;i<g[x].size();i++){
int y=g[x][i];
du[y]--;
if(du[y]==0){
que.push(y);
}
}
}
if(ans.size()==n) for(int i=n-1;i>=0;i--) printf("%d ",ans[i]);
else printf("Impossible!");
printf("\n");
}
int main(){
int T;
scanf("%d",&T);
while(T--){
init();
readin();
toposort();
}
return 0;
}