给出几个景点,然后问你从家出发,不重复经过景点,并且全部游览完再回家么?就是求是否有汉密尔顿回路,在这里在复习下欧拉图还有汉密尔顿的几个概念,
全面进入图论备战计划中
图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");
}
}

浙公网安备 33010602011771号