拓扑排序
#include<iostream>
#define N 505
using namespace std;
int map[N][N];
int into[N];
int ans[N];
int n;
void topsort()
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(map[i][j])
into[j]++;
}
}
for(i=0;i<n;i++) //遍历整个图
{
j=1;
while(into[j]!=0) j++; //找到第一个入度为0的点
ans[i]=j; //将它赋值给ans数组
into[j]--; //将j节点的入度标为-1
for(k=1;k<=n;k++) //将与j为出度的点的入度减去1
{
if(map[j][k]) into[k]--;
}
}
}
int main()
{
int m;
int i,a,b;
while(cin>>n>>m)
{
memset(into,0,sizeof(into));
memset(map,0,sizeof(map));
for(i=0;i<m;i++)
{
cin>>a>>b;
map[a][b]=1;
}
topsort();
for(i=0;i<n-1;i++)
cout<<ans[i]<<' ';
cout<<ans[n-1]<<endl;
}
return 0;
}