这题结论好神。
答案是
gcd(删掉一条非桥边后新产生的桥边数量+1)
#include <bits/stdc++.h>
using namespace std;
#define N 2100
int head[N],nex[N<<1],to[N<<1];
int bridge[N],ib[N],vis[N],dfn[N],low[N],del[N];
int tot,n,m,ans,cnt;
void add(int x,int y)
{
tot++;
nex[tot]=head[x];head[x]=tot;
to[tot]=y;
}
void tarjan(int x,int y)
{
dfn[x]=low[x]=++cnt;
for(int i=head[x];i;i=nex[i])
if((i^1)!=y&&!del[i>>1])
{
if(!dfn[to[i]])
{
tarjan(to[i],i),low[x]=min(low[x],low[to[i]]);
if(low[to[i]]>dfn[x])
bridge[i>>1]=1;
}
else low[x]=min(low[x],dfn[to[i]]);
}
}
void init()
{
cnt=0;
memset(bridge,0,sizeof(bridge));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
}
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d%d",&n,&m);tot=1;
for(int i=1,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i,0);
memcpy(ib,bridge,sizeof(bridge));
for(int i=1,sum;i<=m;i++)
if(!vis[i]&&!ib[i])
{
del[i]=1;sum=1;vis[i]=1;
init();
for(int j=1;j<=n;j++)
if(!dfn[j])
tarjan(j,0);
for(int j=1;j<=m;j++)
if(!ib[j]&&bridge[j])
sum++,vis[j]=1;
ans= !ans ? sum:__gcd(ans,sum);
del[i]=0;
}
for(int i=1;i<ans;i++)
if(ans%i==0)
printf("%d ",i);
if(ans)printf("%d\n",ans);
return 0;
}