割顶:去掉该点后图的连通分量数目增加,则称该点为割顶,下图中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) }