记录编号 |
300919 |
评测结果 |
AAAAAAAAAA |
题目名称 |
备用交换机 |
最终得分 |
100 |
用户昵称 |
AntiLeaf |
是否通过 |
通过 |
代码语言 |
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;
}