拓扑排序的水题。
#include <iostream>
#include<cstring>
#define max 10000+10
using namespace std;
int in[max];
int edge[max];
int root[max];
int next[max];
int que[max];
int main(){
int n,m;
while(cin>>n>>m){
if(n==0&&m==0) break;
memset(in,0,sizeof(in));
memset(root,-1,sizeof(root));
int a,b;
for(int i=0;i<m;i++){
cin>>a>>b;
in[b]++;
edge[i]=b;
next[i]=root[a];
root[a]=i;
}
int l=0,r=0;
for(int i=1;i<=n;i++)
if(in[i]==0) que[r++]=i;
while(l<r){
int a=que[l++],b;
if(l!=1) cout<<' ';
cout<<a;
for(int i=root[a];i!=-1;i=next[i]){
b=edge[i];
in[b]--;
if(in[b]==0) que[r++]=b;
}
}
cout<<endl;
}
return 0;
}