扔上带注释的代码 回去慢慢补==
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define max_edge 10010
#define max_node 10010
using namespace std;
struct Edge {
int u;
int v;
Edge* next;
} edge[max_edge];
Edge* v[max_node];
int DFN[max_node], LOW[max_node];
bool instack[max_node];
int Stap[max_node], Stop;
int Dindex;
int Bcnt, Belong[max_node];
int n;
void tarjan(int i) {
int j;
DFN[i] = LOW[i] = ++Dindex;
instack[i] = true;
Stap[++Stop] = i;
for(Edge *e = v[i]; e; e = e->next) {
j = e->v;
if(!DFN[j]) {
tarjan(j);
LOW[i] = min(LOW[i], LOW[j]);
} else if(instack[j] && DFN[j] < LOW[i])
LOW[i] = DFN[j];
}
if(DFN[i] == LOW[i]) {
Bcnt++;
do {
j = Stap[Stop--];
instack[j] = false;
Belong[j] = Bcnt;
}
while (j!=i);
}
}
void solve() {
int i;
Stop = Bcnt = Dindex = 0;
memset(DFN, 0, sizeof(DFN));
for(int i = 1; i <= n; i++)
if(!DFN[i]) tarjan(i);
}
int main() {
int m;
cin >> n >> m;
for(int i = 1; i <= m; i++) {
cin >> edge[i].u >> edge[i].v;
edge[i].next = v[edge[i].u];
v[edge[i].u] = &edge[i];
}
solve();
return 0;
}
byvoid的详解