求割顶模版

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


 

 

posted @ 2013-09-13 20:04  pangbangb  阅读(146)  评论(0编辑  收藏  举报