思路: 拓扑排序裸题,这里用优先队列的做法。拓扑排序就是每次将入度为 0 的数压入队列,优先队列可以使得压入队列的数按编号从小到大排序。
Code:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N=505;
int n,m;
int e[N][N],pre[N];
void tuopu(){
priority_queue<int,vector<int>,greater<int> > q;
for(int i=1;i<=n;i++)
if(!pre[i]) q.push(i);
int flag=1;
while(!q.empty()){
int start = q.top();
q.pop();
pre[start]=-1;
if(flag){
cout<<start;
flag=0;
}
else cout<<' '<<start;
for(int i=1;i<=n;i++){
if(e[start][i]){
pre[i]--;
if(!pre[i]) q.push(i);
}
}
}
cout<<endl;
}
int main(){
ios::sync_with_stdio(0);
while(cin>>n>>m){
memset(e,0,sizeof(e));
memset(pre,0,sizeof(pre));
for(int i=0;i<m;i++){
int a,b; cin>>a>>b;
if(!e[a][b]){
e[a][b]=1;
pre[b]++;
}
}
tuopu();
}
return 0;
}