满足欧拉回路的条件有:
1. 连通;
2.没有奇点;
所以要先判连通,再判所给的点是否全是偶点,若是都符合,则可以打印欧拉回路。
操作步骤详见代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n;
int G[60][60];
int V[60];
int vis[60][60];
int count[60];
void init()
{
memset(V,0,sizeof(V));
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
memset(count,0,sizeof(count));
}
void dfs(int u)//用于判断是否连通;
{
for(int v=1;v<=50;v++)
if(G[u][v]&&!vis[u][v])
{
vis[u][v]=1;
V[v]=1;
dfs(v);
}
}
void euler(int u)//当满足欧拉回路的条件时,用此函数打印欧拉回路;
{
for(int v=1;v<=50;v++)
{
if(G[u][v])
{
G[u][v]--;
G[v][u]--;
euler(v);
printf("%d %d\n",v,u);
}
}
}
int main()
{
int T;
scanf("%d",&T);
for(int i=0;i<T;i++)
{
if(i)
printf("\n");
printf("Case #%d\n",i+1);
init();
scanf("%d",&n);
int a,b;
for(int j=0;j<n;j++)
{
scanf("%d%d",&a,&b);
G[a][b]++;
G[b][a]++;
count[a]++;
count[b]++;
}
int ok=0, cnt=0;
/*判断图是否连通*/
V[a]=1;
dfs(a);
for(int j=1;j<=50;j++)
{
if(count[j])
{
if(!V[j])
cnt++;
}
}
if(cnt) ok=1;
/*接下来是判断有没有奇点,欧拉回路是不应该有奇点的 */
for(int j=1;j<=50;j++)
{
if(count[j]%2==1)
{
ok=1;
break;
}
}
//满足欧拉回路的条件时,打印欧拉回路;
if(ok)
printf("some beads may be lost\n");
else
{
euler(a);
}
}
return 0;
}
也许不是最好的解法,不是最快的解法,不过个人感觉比较稳妥。