割点问题
题目类型相同,于是放到一起写。套了个版就可以了。
贴出版吧,方便查找。
void dfs(int k, int fa){
int j, i, son = 0;
vis[k] = 1;
PreOrder[k] = BackOrder[k] = dfn ++;
for(i = 0; i < adj[k].size(); i ++){
j = adj[k][i];
if(vis[j] == 1 && j != fa)
BackOrder[k] = min(BackOrder[k], PreOrder[j]);
if(vis[j] == 0){
dfs(j, k);
son ++;
BackOrder[k] = min(BackOrder[k], BackOrder[j]);
if((fa==-1 && son > 1) || (fa != -1 && BackOrder[j] >= PreOrder[k]))
cut[k][j]=cut[j][k]=true;
}
}
vis[k] = 2;
}
调用时PreOrder[i]==0 dfs(i,-1);