刘汝佳大神的topsort
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <vector>
#include <stack>
using namespace std;
const int N = 100;
int n;
int m;
int tot;
int vis[N+2];
int order[N+2];
vector<int> G[N+2];
void read_edge()
{
for (int i = 1; i <= n; i++)
G[i].clear();
int u, v;
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
}
}
bool _dfs(int u)
{
vis[u] = -1; // under
int sz = G[u].size();
for (int i = 0; i < sz; i++)
{
int v = G[u][i];
if (vis[v] == -1)
return false;
if (!vis[v] && !_dfs(v))
return false;
}
vis[u] = 1;
order[--tot] = u;
return true;
}
bool top_sort()
{
memset(vis, 0, sizeof(vis));
memset(order, 0, sizeof(order));
tot = n;
for (int u = 1; u <= n; u++)
if (!vis[u] && !_dfs(u))
return false;
return true;
}
void _print()
{
for (int i = 0; i < n; i++)
printf("%d%s", order[i], (i==n-1) ? "\n" : " ");
}
int main()
{
while (scanf("%d%d", &n, &m) && (n || m))
{
read_edge();
if (top_sort())
_print();
}
return 0;
}