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 64 65 66 67 68 69 70 71 72 73 74
| #include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef unsigned long long ull; typedef pair<int, int> P; #define ms(a, b) memset((a), (b), sizeof(a)) const int N = (int)1e5 + 5; const int INF = 0x3f3f3f3f;
inline int read() { int res = 0;bool f = 0;char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = getchar(); } while (ch <= '9' && ch >= '0') { res = (res << 3) + (res << 1) + ch - '0'; ch = getchar(); } return f ? (~ res + 1) : res; }
struct edge{ int u, v, ne; }ed[N];
int head[N], dis[N], vis[N], cnt, n, m, tot; int dfn[N], low[N]; int s[N], ind; inline void init(){ ms(head, -1); ms(dis, INF); ms(vis, 0); ind = tot = cnt = 0; }
inline void add(int u, int v){ ed[cnt] = {u, v, head[u]}; head[u] = cnt++; } void tarjan(int x){ dfn[x] = low[x] = ++tot; s[++ind] = x; vis[x] = 1; for (int i = head[x]; ~i; i = ed[i].ne){ int v = ed[i].v; if (!dfn[v]){ tarjan(v); low[x] = min(low[x], low[v]); } else if (vis[v]){ low[x] = min(low[x], dfn[v]); }
} if (low[x] == dfn[x]){ do { printf("%d ", s[ind]); vis[s[ind]] = 0; ind--; }while(x != s[ind + 1]); printf("\n"); } }
int main(){ init(); scanf("%d%d", &n, &m); int u, v; for (int i = 1; i <= m; ++i){ scanf("%d%d", &u, &v); add(u, v); } for (int i = 1; i <= n; ++i){ if (!dfn[i]) tarjan(i); } return 0; }
|