1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <cstdio> #include <cstring> #define MAXN 100005 #define MAXM 100005
int edge[MAXM], head[MAXN], next[MAXM], edsz, n, m, indo[MAXN], ans[MAXN];
bool vis[MAXN];
inline void init() { memset(vis, false, sizeof(vis)); memset(indo, 0, sizeof(indo)); memset(head, -1, sizeof(head)); edsz = 0; }
void adds(int a, int b) { ++indo[b]; edge[edsz] = b; next[edsz] = head[a]; head[a] = edsz++; }
void dfs(int k) { if (k == n) { for (int i = 0; i < n - 1; ++i) printf("%d ", ans[i]); printf("%d\n", ans[n - 1]); return; } for (int i = 1; i <= n; ++i) if (!vis[i] && !indo[i]) { ans[k] = i; vis[i] = true; for (int j = head[i]; ~j; j = next[j]) --indo[edge[j]]; dfs(k + 1); for (int j = head[i]; ~j; j = next[j]) ++indo[edge[j]]; vis[i] = false; } }
int main(int argc, char* argv[]) { int a, b; while (scanf("%d%d", &n, &m) != EOF) { init(); for (int i = 0; i < m; ++i) { scanf("%d%d", &a, &b); adds(a, b); } dfs(0); } return 0; }
|