题目:CJOJ P2274 城市的备用交换机
code(PS.数组要开100000)
#include<cstdio>
#include<algorithm>
#define maxn 100011
#define maxe 100011*2
#define STACK_SIZE 64*1024
int nxt[maxe],dis[maxe],fir[maxn];
int dfn[maxn],low[maxn],vis[maxn];
int fa[maxn];
int ans[maxn];
int n,index=0;
inline int gi() {
int x=0;
char p=getchar();
while(p>'9'||p<'0')p=getchar();
while(p<='9'&&p>='0')x=x*10+p-'0',p=getchar();
return x;
}
inline void addE(int F,int T,int id) {
nxt[id]=fir[F];
dis[id]=T;
fir[F]=id;
}
inline void init() {
n=gi();
int a,b;
for(int i=1; scanf("%d%d",&a,&b)==2; i++) {
addE(a,b,(i<<1)-1);
addE(b,a,i<<1);
}
}
inline void Tarjan(int now) {
// printf("%d\n",now);
int flag=0;
dfn[now]=low[now]=++index;
vis[now]=1;
for(int i=fir[now]; i; i=nxt[i]) {
if(!vis[dis[i]]) {
fa[dis[i]]=now;
Tarjan(dis[i]);
if(low[dis[i]]<low[now])low[now]=low[dis[i]];
if(low[dis[i]]>=dfn[now])flag++;
} else if(fa[now]!=dis[i]&&dfn[dis[i]]<low[now])low[now]=dfn[dis[i]];
}
if(now==1&&flag>1)ans[++ans[0]]=now;
if(now!=1&&flag)ans[++ans[0]]=now;
}
inline void output() {
std::sort(ans+1,ans+1+ans[0]);
printf("%d\n",ans[0]);
for(int i=1; i<=ans[0]; i++)printf("%d\n",ans[i]);
}
int main() {
init();
Tarjan(1);
output();
return 0;
}