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 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <cstdio> #include <iostream> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <string>
using namespace std; #define mem(a, b) memset(a, b, sizeof(a)) #define PI acos(-1) #define debug(a) cout << (a) << endl typedef long long ll; int dir8[8][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}}; int dir4[4][2] = {1, 0, 0, 1, -1, 0, 0, -1}; const int INF = 0x3f3f3f3fLL; const long long LLF = 0x3f3f3f3f3f3f3f3fLL; const int MAXn = 1e4 + 15; const int mod = 1e9 + 7;
struct node { int u, v, next; } edge[MAXn]; int head_edge[MAXn]; bool in_Stack[MAXn]; bool visit[MAXn]; int DFN[MAXn]; int LOW[MAXn]; int Stack[MAXn]; int tot_edge; int Index; int tot_point;
void add_edge(int u, int v) { edge[++tot_edge] = { u, v, head_edge[u] }; head_edge[u] = tot_edge; }
void init() { tot_edge = tot_point = Index = 0; mem(in_Stack, 0); mem(visit, 0); mem(Stack, 0); mem(head_edge, 0); }
void Tarjan(int x) { DFN[x] = LOW[x] = ++tot_point; Stack[++Index] = x; in_Stack[x] = visit[x] = 1; for (int i = head_edge[x]; i != 0; i = edge[i].next) { if (!DFN[edge[i].v]) { Tarjan(edge[i].v); LOW[x] = min(LOW[edge[i].v], LOW[x]); } else if (in_Stack[edge[i].v]) { LOW[x] = min(LOW[edge[i].v], LOW[x]); } } if (DFN[x] == LOW[x]) { do{ printf("%d ",Stack[Index]); visit[Stack[Index]]=0; Index--; }while(x!=Stack[Index+1]); printf("\n"); } return; } int main() { for (int i = 1; i <= n; i++) if (!visit[i]) Tarjan(i); return 0; }
|