有两种缩点的方法:
void tarjan(int x, int fa) {
dfn[x] = low[x] = ++idx;
stk[++top] = x, ins[x] = 1;
for (int i = h[x]; i; i = e[i].nx) {
int y = e[i].v;
if(y == fa) continue;
if(!dfn[y]) {
tarjan(y, x);
low[x] = min(low[x], low[y]);
} else if(ins[y]) low[x] = min(low[x], dfn[y]);
}
if(dfn[x] == low[x]) {
int y;
dcc[x] = ++col;
do {
y = stk[top--];
dcc[y] = col;
ins[y] = 0;
} while(y != x);
}
}
void tarjan(int x, int la) {
dfn[x] = low[x] = ++idx;
for (int i = h[x]; i; i = e[i].nx) {
int y = e[i].v;
if(!dfn[y]) {
tarjan(y, i);
if(dfn[x] < low[y]) f[i] = f[i ^ 1] = 1;
low[x] = min(low[x], low[y]);
} else if(i != (la ^ 1)) {
low[x] = min(low[x], dfn[y]);
}
}
}
void dfs(int x, int col) {
dcc[x] = col;
siz[col]++;
for (int i = h[x]; i; i = e[i].nx) {
int y = e[i].v;
if(dcc[y] || f[i]) continue;
dfs(y, col);
}
}
前者有重边时是不是会寄掉??