基于广度优先搜索的哈密顿图的判断算法
题目:哈密顿通路是指,在一个无向图中,存在一条经过图中每一个点,且仅经过一次的通路,若这条通路形成了闭合回路,则称这条回路为哈密顿回路,存在哈密顿回路的图称为哈密顿图。现给出无向图G的边,要求判断无向图G中是否存在哈密顿通路,且判断其是否为哈密顿图。
Input:
第一行为节点数n
第二行到倒数第二行为每一条边的信息,每行有两个数字,以空格分开,代表节点编号
最后一行为1-n以外的两个数字,表示输入结束
Output:
“存在哈密顿通路”或“不存在哈密顿通路”,换行
“是哈密顿图”或“不是哈密顿图”
输入样例1:
5
1 2
2 3
3 4
4 5
5 1
0 0
输出样例1:
存在哈密顿通路
是哈密顿图
输入样例2:
5
1 2
1 3
2 3
2 4
2 5
3 4
3 5
0 0
输出样例2:
存在哈密顿通路
不是哈密顿图
解题分析:
先使用一个二维数组存储无向图G的关系矩阵,然后使用广度优先搜索算法,使用变量t存储已经经过的节点。对于每一个节点,若存在未经过的与其关联的节点,则移动到此节点再次搜索,如不存在此节点,则返回。
在每一个节点处进行判断,若t=n,则已经无重复地通过了全部节点,即存在哈密顿通路,在此基础上,若t=n时,所处的点与1号点关联,则形成了哈密顿回路,即为哈密顿图。
实现代码:
#include<iostream>
#include<cstring>
using namespace std;
int n,t=0,access=0,circuit=0;
//n为节点数,t为经过节点数,access表示是否为哈密顿通路,circuit表示是否为哈密顿图
int rel[100][100]={0};
int visited[100];
//rel表示无向图G, visited表示经过的节点编号
bool judge(int num){
//judge函数判断num号节点是否存在未经过的关联节点
for(int i=1;i<=n;i++){
if(rel[num][i]==1&&visited[i]==0) return true;
}
return false;
}
void search(int start){
//search函数进行递归,搜索连通图中每一个节点
int i;
t++;
if(t==n) access=1;
//判断哈密顿通路
if(t==n&&rel[start][1]==1) circuit=1;
//判断哈密顿回路
if(!judge(start)) return;
//不存在未经过的关联节点时结束递归
for(i=1;i<=n;i++){
if(rel[start][i]==1&&visited[i]==0){
visited[i]=1;
search(i);
//存在未经过关联节点时继续递归
visited[i]=0;
t--;
//重置经过节点编号与经过节点数
}
}
}
int main() {
cin>>n;
memset(visited,0,sizeof(visited));
//将数组初始化置为未经过
int a,b;
//a,b表示每一条边的两端节点编号
while(1){
//读入无向图G关系矩阵
cin>>a>>b;
if(a>0&&b>0&&a<=n&&b<=n){
rel[a][b]=1;
rel[b][a]=1;
}
else break;
}
visited[1]=1;
//从1号节点开始搜索
search(1);
if(access==1) cout<<"存在哈密顿通路"<<endl;
//输出结果
else cout<<"不存在哈密顿通路"<<endl;
if(circuit==1) cout<<"是哈密顿图"<<endl;
else cout<<"不是哈密顿图"<<endl;
return 0;
}
基于广度优先搜索的哈密顿图的判断算法相关推荐
- 广度优先搜索_计算机入门必备算法——广度优先遍历搜索
1. 序言 又很久没有学习了,上次学到哈希表又称散列表的相关知识,这次我们学习一种新的数据结构来建立网络模型.这种数据结构被称作图.首先,我们先应该先了解一下什么是图,其次学习第一种图的算法,这种图 ...
- 【CV系列】基于直方图的白天夜晚场景判断算法
DATE: 2019-7-6 简单的白天夜晚场景判断算法: 基于直方图,不够准确,容易出现误判,对于那些亮度很高的夜晚场景或者亮度很低的白天场景会出现误判. int day_night_estimat ...
- 力扣入门级广度优先搜索/遍历刷题小结
刷这些题时死掉的脑细胞是我当年在<线性代数>和<概率论与数理统计>课上没学明白时苟活下来的( 这几题基本是抄作业了,但我发现官方题解写的也很绕,都不知道是我天然看到这类题就头晕 ...
- 限界分支法(实际上没有剪枝,介绍的是广度优先搜索):01背包问题,队列实现方式(FIFO)
限界分支法:队列实现方式 前面已经介绍过限界分支法大部分是基于广度优先搜索,广度优先搜索一般借助于队列实现,剪枝的情况可以借助于优先级队列. 实现如下: #%% class FIFO_01_Pack: ...
- 复现一篇分布式装配置换流水车间调度问题的代码——基于回溯搜索的超启发式算法
复现一篇分布式装配置换流水车间调度问题的代码--基于回溯搜索的超启发式算法 摘要 算法框架 说明 代码 测试类 算法主体 Assignment Heuristics Individual Method ...
- a - 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历_数据结构--图
故事凌 今天 基本知识点 图可说是所有数据结构里面知识点最丰富的一个, 自己笨的知识点如下: 阶(oRDER), 度: 出度(out-Degree), 入度(in-Degree) 树(Tree), 森 ...
- 广度优先算法_算法浅谈——走迷宫问题与广度优先搜索
本文始发于个人公众号:TechFlow,原创不易,求个关注 在之前周末LeetCode专栏当中,我们详细描述了深度优先搜索和回溯法,所以今天我们继续这个话题,来和大家聊聊搜索算法的另一个分支,广度优先 ...
- 无向图、深度优先搜索(无向图)、广度优先搜索(无向图)、无向图路径查找(基于深度优先搜索)
一.无向图 1.1 图的相关术语 相邻顶点: 当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点. 度: 某个顶点的度就是依附于该顶点的边的个数. 子图: 是一幅图的所 ...
- JS算法:广度优先搜索(BSF)的理解
广度优先搜索方法的实现 (基于<学习JavaScript数据结构与算法>补充学习) 实现步骤如下 1.用initializeColor函数来将color数组初始化为白色:也就是将每个节点初 ...
- java广度优先算法,算法之广度优先搜索
一.引言 上一次介绍的算法是深度优先搜索 这次我们来研究一下广度优先搜索,看看怎么理解以及写出这个算法 这个算法需要数据结构的基础--队列,如果没有这个基础的同学去恶补一下. 二.小小问题 Q:在一个 ...
最新文章
- 局域网通知系统(消息群发)
- matlab pareto 升级版
- 快速开发平台网格部件合并单元格。
- 人生路上对我影响最大的三位老师
- CNN看清世界——浅谈四个经典网络的差异
- java 课程设计数据库_人事管理系统(java数据库课程设计)+SQL数据库
- 为啥有人说每个程序员都应该这学习5种编程语言?
- HandlerMethodArgumentResolver 参数解析器
- 【笔记+代码】网格搜索-GridSearchCV
- 致远SPM之金蝶K3集成解决方案
- 深度 | 蚂蚁金服DASFAA论文带你深入了解GBDT模型
- 2016红帽年度创新大奖榜单揭晓
- KK 在 68 岁生日时给出的 68 条建议[翻译]#yyds干货盘点#
- 6782. 2020.08.06【NOI2020】模拟T3 乌拉乌拉
- nginx 使用配置解释
- Core Data概述
- maven 配置多个仓库
- 【推荐系统系列6】ALS推荐算法原理
- 微软新编程字体开源,用着一不小心就骂人了
- [人脸对齐] SAN:Style Aggregated Network for Facial Landmark Detection 论文阅读
热门文章
- 【VFB】复制VB代码(VB与FB的差异)(VFB教程3-6)
- Ubuntu完美安装QQ
- 《你是三月的小桨》光剑
- 网络编程在线英英词典之客户端代码框架搭建(一)
- Android9输入法留白配置,拇指于键盘间游离 2015安卓输入法横评
- 大型网站技术架构演进与性能优化
- java我行我素购物系统_用java怎么编写 我行我素shopping购物管理体统
- python打开360浏览器_使用python3.7 的pycharm selenium自动化测试中启动360浏览器、360极速浏览器的方法...
- Windows Server 2012 AD域管理创建
- “元宇宙”是个啥?都有哪些大招?