void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出几个景点,然后问你从家出发,不重复经过景点,并且全部游览完再回家么?就是求是否有汉密尔顿回路,在这里在复习下欧拉图还有汉密尔顿的几个概念,

全面进入图论备战计划中

图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路

具有欧拉回路的图称为欧拉图(简称E图)。

欧拉回路的判断  一下判断基于此图的基图连通。

无向图存在欧拉回路条件

  一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。

有向图存在欧拉回路条件

  一个有向图存在欧拉回路,且所有顶点的入度等于出度

混合图存在欧拉回路条件

  要判断一个混合图G(V,E)(既有有向边又有无向 欧拉回路的判断  一下判断基于此图的基图连通。

无向图存在欧拉回路条件

  一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。

有向图存在欧拉回路条件

  一个有向图存在欧拉回路,且所有顶点的入度等于出度

汉密尔顿定义:

给定图G,若存在一条路经过图中的每个结点恰好一次,这条路称作汉密尔顿路。若存在一条回路,经过图中的每个结点恰好一次,这条回路称作汉密尔顿回路。

汉密尔顿回路的判定,目前主流的就是用dfs了,此题刚好作为一个例子 ,无向图.

  

#include <stdio.h>
#include <string.h>
#define N 11
int map[N][N],n,step;
char spot[30];
bool used[N];
bool flag;
void dfs(int x)
{
    if(x==0&&step==n+1){flag=true;return;}
    if(flag)return ;
    for(int i=0;i<=n;i++)
    {
        if(!used[i]&&map[x][i]==1)
        {
           used[i]=true;
           step++;
            dfs(i);
            step--;
            used[i]=false;
        }
        
    }
}

int main()
{
    int ca=0;
    while(scanf("%d",&n)!=EOF&&n)
    {
        getchar();
        step=0;flag=false;
        memset(map,0,sizeof(map));
        memset(used,false,sizeof(used));
        for(int i=1;i<=n;i++)
        {
            
            gets(spot);
            int num=0;
            for(int j=0;j<strlen(spot);j++)
            {
                num=0;
                while(spot[j]>='0'&&spot[j]<='9')
                {num=num*10+(spot[j]-'0');j++;}
                //printf("map[%d][%d]\n",i,num);
                map[i][num]=1;
                map[num][i]=1;
            }
            
        }
        dfs(0);
        printf("Case %d: ",++ca);     
        if(flag)   
            printf("Granny can make the circuit.\n");   
        else  
            printf("Granny can not make the circuit.\n");   

    }
    
    
}
posted on 2011-05-14 21:37  void-man  阅读(1657)  评论(0)    收藏  举报