题记:用邻接表存图,然后把拓扑排序中的队列改成优先队列,每次取队头元素时用ans数组存下来即可。(题目n最大500,用邻接矩阵也可以)。
#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int N=510;
int h[N],e[N],ne[N],idx;
int n,m;
int d[N];
vector<int>ans;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void topsort(){
priority_queue<int,vector<int>,greater<int>> q;
for(int i=1;i<=n;i++)
if(!d[i]){
q.push(i);
//cout<<i<<endl;
}
ans.clear();
while(!q.empty()){
int t=q.top();
ans.push_back(t);
q.pop();
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
d[j]--;
if(!d[j])q.push(j);
}
}
}
int main(){
while(cin>>n>>m){
memset(h,-1,sizeof(h));
memset(e,0,sizeof(e));
memset(ne,0,sizeof(ne));
memset(d,0,sizeof(d));
idx=0;
while(m--){
int a,b;
cin>>a>>b;
add(a,b);
d[b]++;
}
topsort();
for(int i=0;i<ans.size();i++){
if(i!=ans.size()-1) cout<<ans[i]<<' ';
else cout<<ans[i];
}
cout<<endl;
}
return 0;
}