割顶:去掉该点后图的连通分量数目增加,则称该点为割顶,下图中D和E是割顶
struct node{
int from,to,nex;
}edge[2*M];
int head[N],edgenum;
void addedge(int u,int v){
node E={u,v,head[u]};
edge[edgenum]=E;
head[u]=edgenum++;
}
int pre[N],low[N],dfs_clock;
bool iscut[N];
int dfs(int u,int fa){//是连通图,dfs(u, )目的是寻找u的后代所能连回的(最早的祖先)的pre值
int lowu=pre[u]= ++ dfs_clock;
int child=0;
for(int i=head[u];i!=-1;i=edge[i].nex){
int v=edge[i].to;
if(!pre[v]){
child++;
int lowv=dfs(v,u);
lowu = Min(lowu, lowv);
if(lowv >= pre[u])iscut[u]=true;
}
else if(pre[v] < pre[u] && v!=fa)
lowu = Min(lowu, pre[v]);
}
if(fa==-1 && child==1)iscut[u]=0;//判断树根是不是割点
return low[u]=lowu;
}
void findcut(){
memset(pre,0,sizeof(pre));
memset(iscut,0,sizeof(iscut));
dfs_clock=0;
dfs(1,-1);//dfs(树根,树根的父亲是-1)
}