题解:
裸的拓扑排序,
但是要求最小序。
那把队列换成优先队列即可。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<queue>
#include<vector>
using namespace std;
const int maxn=555;
int n,m,x,y,cnt;
int indegree[maxn],head[maxn];
struct node{
int to,nxt;
}edge[maxn];
struct cmp{
bool operator ()(int &a,int &b){
return a>b;
}
};
void addedge(int x,int y){
edge[cnt].to=y;
edge[cnt].nxt=head[x];
head[x]=cnt++;
}
int main(){
priority_queue<int,vector<int>,cmp>que;
vector<int>vec;
while(~scanf("%d %d",&n,&m)){
vec.clear();
memset(head,-1,sizeof(head));
memset(indegree,0,sizeof(indegree));
cnt=1;
for(int i=1;i<=m;++i){
scanf("%d %d",&x,&y);
addedge(x,y);
indegree[y]++;
}
for(int i=1;i<=n;++i)
if(indegree[i]==0) que.push(i);
while(!que.empty()){
int t=que.top();vec.push_back(t);
que.pop();
for(int k=head[t];k!=-1;k=edge[k].nxt){
indegree[edge[k].to]--;
if(indegree[edge[k].to]==0) que.push(edge[k].to);
}
}
if(vec.size()) printf("%d",vec[0]);
for(int i=1;i<vec.size();++i)
printf(" %d",vec[i]);
puts("");
}
return 0;
}