拓扑排序 模板
#include <cstdio>
#include <cstring>
const int maxn = 110;
int n, m;
int G[maxn][maxn], topo[maxn];
int c[maxn], t;
bool dfs(int u)
{
c[u] = -1;
for(int v = 1; v <= n; v++)
if(G[u][v])
{
if(c[v] < 0) return false;
else if(!c[v] && !dfs(v)) return false;
}
c[u] = 1;
topo[--t] = u;
return true;
}
bool toposort()
{
t = n;
memset(c, 0, sizeof(c));
for(int u = 1; u <= n; u++)
if(!c[u])
if(!dfs(u)) return false;
return true;
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF )
{
if(!m && !n) break;
int u, v;
memset(G, 0, sizeof(G));
while(m--)
{
scanf("%d%d", &u, &v);
G[u][v] = 1;
}
toposort();
for(int i = 0; i < n; i++)
{
printf("%s", i ? " " : "");
printf("%d", topo[i]);
}
printf("\n");
}
return 0;
}