码迷,mamicode.com
首页 > 其他好文 > 详细

The Necklace UVA 10054 (无向图的欧拉回路,求证Flury算法)

时间:2014-09-24 22:22:28      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:acm   c   uva   源代码   算法   

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


由于我是到达一条边,就将该边删除,并输出,所以我最后一句是return,这样才能保证整条路是连续的。不过这样做其实是有问题的。当某节点的度为2,当在遍历全图的每条边之前,又回到了该点,形成了一个闭环,那么显然整个程序就终止了,并且生成的不是欧拉回路。其实真正的无向图的Fleury应该是下面这样的。

 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);
   }

该程序于上面程序的不同在于:一,没有return,即当从当前节点进入某一节点DFS之后,它还会回来,并且沿该节点的其他关联节点继续DFS。二,输出是在递归之后的,也就是说,是倒着输出的。在输出的时候,该节点i相连的子图已经被遍历完了,因此可以从该节点,回到上一节点所在的子图中了。其实,我感觉Flury算法的证明是非常复杂的。网上相关的内容也非常少,大多数贴的都是例程。我上面写的也只是想了一个多小时产生的感性认识。下面还是贴出这道题的源代码吧!


源代码:

#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算法)

标签:acm   c   uva   源代码   算法   

原文地址:http://blog.csdn.net/u011915301/article/details/39527121

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!