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