悬关求调RE
查看原帖
悬关求调RE
999274
CNS_5t0_0r2楼主2023/8/9 11:37
#include<bits/stdc++.h>
using namespace std;
const int N = 2 * 1e4 + 9,M = 2 * 1e5 + 9;
struct egde{
	int to,nex;
} e[M];
int ecnt,head[N];
void addegde(int u,int v){
	ecnt++;
	e[ecnt] = (egde){v,head[u]};
	head[u] = ecnt;
}
int n,m,x,y,ans;
int id,num[N],low[N];
bool flag[N];
void dfs(int root,int cur,int father){
	int child = 0;
	id++;
	num[cur] = id;
	low[cur] = id;
	for(int i = head[cur];i;i = e[i].nex){
		int v = e[i].to;
		if(!num[v]){
			child++;
			dfs(root,v,cur);
			low[cur] = min(low[cur],low[v]);
			if(cur != root && low[i] >= num[cur])
				flag[cur] = true;
			if(cur == root && child == 2)
				flag[cur] = true;
		}
		else if(v != father)
			low[cur] = min(low[cur],num[v]);
	}
	return;
}
int main(){
	scanf("%d%d", &n, &m);
	for(int i = 1;i <= m;i++){
		scanf("%d%d", &x, &y);
		addegde(x,y);
		addegde(y,x);
	}
	for(int i = 1;i <= n;i++)
		if(!num[i]){
			id = 0;
			dfs(i,i,i);
		}
	for(int i = 1;i <= n;i++)
		if(flag[i])
			ans++;
	printf("%d\n",ans);
	for(int i = 1;i <= n;i++)
		if(flag[i])
			printf("%d ",i);
	return 0;
}
2023/8/9 11:37
加载中...