说说:题目的意思本质上就是给你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