记录编号 300919 评测结果 AAAAAAAAAA
题目名称 备用交换机 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.031 s
提交时间 2016-08-29 11:02:50 内存使用 0.34 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
void dfs(int);
int a[maxn][maxn]={{0}};
int color[maxn]={0},col=0,first[maxn],low[maxn],tim=0,ch[maxn]={0},prt[maxn]={0};
bool ge[maxn]={false};
int n,x,y;
int main(){
#define MINE
#ifdef MINE
	freopen("gd.in","r",stdin);
	freopen("gd.out","w",stdout);
#endif
	scanf("%d",&n);
	while(scanf("%d%d",&x,&y)==2)a[x][y]=a[y][x]=1;
	for(int i=1;i<=n;i++)if(!color[i]){
		col++;
		dfs(i);
	}
	int m=0;
	for(int i=1;i<=n;i++){
		if(!prt[i]&&ch[i]>1)ge[i]=true;
		if(prt[prt[i]]&&low[i]>=first[prt[i]])ge[prt[i]]=true;
	}
	for(int i=1;i<=n;i++)if(ge[i])m++;
	printf("%d\n",m);
	for(int i=1;i<=n;i++)if(ge[i])printf("%d\n",i);
	return 0;
}
void dfs(int x){
	color[x]=-col;
	low[x]=first[x]=++tim;
	for(int y=1;y<=n;y++)if(a[x][y]>0){
		a[x][y]=-a[x][y];
		if(!color[y]){
			ch[x]++;
			prt[y]=x;
			dfs(y);
			low[x]=min(low[x],low[y]);
		}
		else if(color[y]<0){
			low[x]=min(low[x],first[y]);
		}
		a[x][y]=-a[x][y];
	}
	color[x]=col;
}