在求关节点的过程中顺便把每个重联通分量求出。用数组模拟栈。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXN 20 //顶点的最大值
#define MAXM 40//边数的最大值
#define min(a,b) ((a)>(b)?(b):(a))
struct edge
{
int u,v;
void output()
{
printf("%d-%d",u,v);
}
int comp(edge& t)
{
return ((u==t.u && v==t.v)||(u==t.v && v==t.u));
}
};
edge edges[MAXM];//边的数组(模拟栈)
int se;//栈顶
int Edge[MAXN][MAXN];
int vis[MAXN];
int n,m;//顶点数,边数
int tmpdfn;
int dfn[MAXN];
int low[MAXN];
void init()
{
low[1]=dfn[1]=1;
tmpdfn=1;
memset(vis,0,sizeof(vis));
vis[1]=1;
memset(edges,0,sizeof(edges));
}
void dfs(int u)
{
for(int v=1;v<=n;v++)
{
if(Edge[u][v]==1)
{
edge t;
t.u=u;t.v=v;edges[++se]=t;
Edge[u][v]=Edge[v][u]=2;
if(!vis[v])
{
vis[v]=1;
tmpdfn++;dfn[v]=low[v]=tmpdfn;
dfs(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<=low[v])
{
bool firstedge=true;
while(1)
{
if(se<0) break;
if(firstedge) firstedge=false;
else cout<<" ";
edge t1;
t1=edges[se];
t1.output();
edges[se].u=0;edges[se].v=0;
se--;
if(t1.comp(t))break;
}
cout<<endl;
}
}
else
low[u]=min(low[u],dfn[v]);
}
}
}
int main()
{
int u,v;
int number=1;
while(1)
{
scanf("%d%d",&n,&m);
if(n==0 && m==0) break;
memset(Edge,0,sizeof(Edge));
for(int i=1;i<=m;i++)
{
cin>>u>>v;
Edge[u][v]=Edge[v][u]=1;
}
if(number>1) cout<<endl;
number++;
init();
se=1;
dfs(1);
}
}
/*
7 9
1 2
1 3
1 6
1 7
2 3
2 4
2 5
4 5
6 7
*/