记录编号 356907 评测结果 AAAAAAAAAA
题目名称 备用交换机 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2016-12-07 15:28:09 内存使用 2.67 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010;
int n,w[N],head[N],tail[N],next[N],cnt;
void add(int f,int t){
	w[++cnt]=t;
	if (!head[f]) head[f]=tail[f]=cnt;
		else tail[f]=next[tail[f]]=cnt;
	w[++cnt]=f;
	if (!head[t]) head[t]=tail[t]=cnt;
		else tail[t]=next[tail[t]]=cnt;
}
int dfn[N],low[N],sum;bool tag[N];
void dfs(int x,int fa){
	low[x]=dfn[x]=++sum;
	int cnt=0;
	for (int i=head[x];i;i=next[i]){
		if (!dfn[w[i]]){
			cnt++;dfs(w[i],x);
			low[x]=min(low[x],low[w[i]]);
			if (low[w[i]]>=dfn[x]) tag[x]=1;
		}
		else
		if (dfn[w[i]]&&w[i]!=fa)
			low[x]=min(low[x],dfn[w[i]]);
	}
	if (!fa&&cnt<2) tag[x]=0;
}
int main()
{
	freopen("gd.in","r",stdin);
	freopen("gd.out","w",stdout);
	scanf("%d",&n);
	int x,y;
	while (~scanf("%d%d",&x,&y)) add(x,y);
	for (int i=1;i<=n;i++)
	if (!dfn[i]) dfs(i,0);
	int ans=0;
	for (int i=1;i<=n;i++)
	if (tag[i]) ans++;
	printf("%d\n",ans);
	for (int i=1;i<=n;i++)
	if (tag[i]) printf("%d\n",i);
	return 0;
}