哈密尔顿环

2023-12-28 07:58
文章标签 哈密尔顿

本文主要是介绍哈密尔顿环,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欧拉回路是指不重复的走过所有路径的回路,而哈密尔顿环是指不重复地走过所有的点,并且最后还能回到起点的回路。使用简单的深度优先搜索,就能求出一张图中所有的哈密尔顿环,下面给出一段参考程序:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iomanip>
#include <vector>
using namespace std;
int start,length,x,n;
bool visited[101],v1[101];
int ans[101],num[101];
int g[101][101];
void print()
{int i;for(i=1;i<=length-1;i++)cout<<ans[i]<<' ';cout<<ans[length]<<endl;
}
void dfs(int last,int i)  //图用数组模拟邻接表存储,访问点i,last表示上次访问的点
{visited[i]=1;       //标记为已经访问过v1[i]=1;              //标记为已在一张图中出现过ans[length++]=i;      //记录下答案for(int j=1;j<=num[i];j++){if(g[i][j]==x&&g[i][j]!=last){   //回到起点构成哈密顿环ans[++length]=g[i][j];print(); //这里说明找到了一个环,则输出ans数组length--;break;}if(!visited[g[i][j]])dfs(i,g[i][j]); //遍历与i相关联的所有未访问的点。}length--;visited[i]=0;//回溯的过程,注意v1不能回溯
}
int main()
{memset(visited,0,sizeof(visited));memset(v1,0,sizeof(v1));cin>>n;int m;cin>>m;for(int i=1;i<=m;i++){ int x,y;cin>>x>>y;g[x][++num[x]]=y;g[y][++num[y]]=x;}for(x=1;x<=n;x++) //每一个点都作为起点来尝试访问,因为不是从任何一点开始都能找过整个图{if(!v1[x])  //如果点x不在之前曾经被访问过的图里{length=0;   //定义一个ans数组存答案,length记答案的长度dfs(0,x);}}return 0;
}


这篇关于哈密尔顿环的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/545376

相关文章

哈密尔顿回路 - 杂录

哈密尔顿回路 1859年,爱尔兰数学家哈密尔顿(Hamilton) 提出了一个周游世界的游戏 在正十二面体上依次标记伦敦、巴黎、莫斯科等世界著名大城市, 正十二面体的棱表示连接这些城市的路线. 试问能否在图中做一次旅行, 从顶点到顶点, 沿着边行走, 经过每个城市一次之后再回到出发点. 转载于 (https://www.jianshu.com/p/57bd58cf8115) 哈密尔顿回路

图论---哈密尔顿回路与欧拉回路相关概念

哈密尔顿回路与欧拉回路相关概念: 1.哈密尔顿: 哈密尔顿道路:通过图G中每个顶点一次且仅一次的道路称作该图的一条哈密尔顿道路. 哈密尔顿回路:通过图G中每个顶点一次且仅一次的道路称作该图的一条哈密尔顿回路. 哈密尔顿图:存在哈密尔顿回路的图称作哈密尔顿图. 注意: 判断一个图是否为哈密尔顿图属于NP难问题,目前没有推出充分必要条件! 2.欧拉: 欧拉通路与欧拉回路 欧拉通路: 对于图G

第四单元 贪心算法 4.1 装载问题 4.2 区间问题 4.3 删数问题 4.4 工序问题 4.5 种树问题 4.6 马的哈密尔顿链4.7 三值的排序 4.8 田忌赛马 4.9 小结

第四单元 贪心算法 以下 9 个问题都给出了相应贪心策略,但是为什么这些策略是正确的呢?请自己证明(提示:反证法)。 4.1 装载问题 (1) 简单的装载问题 【问题描述】有 n 件物品和一个容量为 C 的背包。第 i 件物品的重量是 w[i]。求解将哪些物品装入背包可物品 数量最多。 【贪心策略】将物品重量从小到大进行排序,优先挑重量轻的装入背包。 (2) 部分背包问题 【问题描述】