说说:题目的意思本质上就是给你N条无向边,若存在欧拉回路,则将其生成。无向图的欧拉回路的判断非常容易,只要判断是否每个节点都是偶数度即可。但是,对欧拉回路的生成,也就是Fleury算法,貌似有点问题。我自己在这个地方也纠结了好久。下面就来讲讲Fleury算法。
开始我觉得,就是个非常简单的深度优先搜索的问题,直接从任意一个节点,然后不断DFS即可。所以就有了如下的代码:
for(i=1;i<MAX;i++)
if(map[m][i]>0){
map[m][i]--;
map[i][m]--; <pre name="code" class="cpp"> printf("%d %d\n",i,m); Euler(i); for(i=1;i<MAX;i++)
if(map[m][i]>0){
map[m][i]--;
map[i][m]--;
Euler(i);
printf("%d %d\n",i,m);
}
源代码:
#include <stdio.h>
#include <string.h>
#define MAX 50+5
int map[MAX][MAX];
int nodecnt[MAX];//统计每个节点的度数
void Euler(int);
int main(){
int T,M,i,j,l,r,N=1,YES;
// freopen("data","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d",&M);
YES=1;
memset(map,0,sizeof(map));
memset(nodecnt,0,sizeof(nodecnt));
for(i=0;i<M;i++){
scanf("%d%d",&l,&r);
map[l][r]++;
map[r][l]++;
nodecnt[l]++;
nodecnt[r]++;
}
printf("Case #%d\n",N++);
for(i=0;i<MAX;i++)//判断是否存在欧拉回路
if(nodecnt[i]%2){
YES=0;
printf("some beads may be lost\n");
break;
}
if(YES)
Euler(l);
if(T) putchar('\n');
}
return 0;
}
void Euler(int m){
int i;
for(i=1;i<MAX;i++)//Flury算法生成欧拉回路
if(map[m][i]>0){
map[m][i]--;
map[i][m]--;
Euler(i);
printf("%d %d\n",i,m);
}
return;
}
The Necklace UVA 10054 (无向图的欧拉回路,求证Flury算法)
原文地址:http://blog.csdn.net/u011915301/article/details/39527121