http://codeforces.com/contest/412/problem/D
逆向建图+dfs
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stack>
#include <vector>
#define LL long long
#define _LL __int64
using namespace std;
const int maxn = 30010;
vector <int> edge[maxn];
int n,m;
int ans[maxn],cnt;
int vis[maxn];
void dfs(int u)
{
vis[u] = 1;
for(int i = 0; i < (int)edge[u].size(); i++)
{
int v = edge[u][i];
if(!vis[v])
dfs(v);
}
ans[cnt++] = u;
}
int main()
{
int u,v;
while(~scanf("%d %d",&n,&m))
{
for(int i = 1; i <= n; i++)
edge[i].clear();
for(int i = 1; i <= m; i++)
{
scanf("%d %d",&u,&v);
edge[v].push_back(u);
}
memset(vis,0,sizeof(vis));
cnt = 0;
for(int i = 1; i <= n; i++)
if(!vis[i])
dfs(i);
printf("%d",ans[cnt-1]);
for(int i = cnt-2; i >= 0; i--)
printf(" %d",ans[i]);
printf("\n");
}
return 0;
}