luogu_3388 【模板】割点(割顶)

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m,sum,dfs_clock;
vector<int> G[N];
int pre[N],low[N],iscut[N];

int dfs(int u,int fa){
	int lowu=pre[u]=++dfs_clock;
	int child=0;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		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(child==1 && fa<0)iscut[u]=0;
	low[u]=lowu;
	return lowu;
}

int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].push_back(v); G[v].push_back(u);
	}
	for(int i=1;i<=n;i++)
		if(!pre[i])dfs(i,-1);
	for(int i=1;i<=n;i++)if(iscut[i])sum++;
	printf("%d\n",sum);
	for(int i=1;i<=n;i++)
		if(iscut[i])printf("%d ",i);
	puts("");
	return 0;
}

  

posted @ 2017-09-27 20:05  wqtnb_tql_qwq_%%%  阅读(109)  评论(0编辑  收藏  举报