拓扑板子题
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e2+10;
int in[maxn];//各定点入度
vector<int>edge[maxn];//存图
void init(){
memset(in,0,sizeof(in));
for(int i=0;i<maxn;i++)
edge[i].clear();
}
int main() {
int n,m,x,y;
while(cin>>n>>m) {
init();
for(int i=0; i<m; i++) {
cin>>x>>y;
in[y]++;
edge[x].push_back(y);
}
priority_queue<int,vector<int>,greater<int> >q;
for(int i=1; i<=n; i++) {
if(in[i] == 0) q.push(i);
}
vector<int> ans;
while(!q.empty()) {
int k = q.top();
q.pop();
ans.push_back(k);
for(int i=0; i<edge[k].size(); i++) {
int y = edge[k][i];
in[y]--;
if(in[y]==0)
q.push(y);
}
}
for(int i=0; i<ans.size()-1; i++) {
cout<<ans[i]<<' ';
}
cout<<ans[ans.size()-1]<<endl;
}
return 0;
}