爬山法、分支限界法求解哈密顿环问题

本文介绍了哈密顿环问题及其最小化版本,探讨了如何使用树搜索策略,包括深度优先(DFS)、广度优先(BFS)以及爬山法来解决无向连通图的哈密顿环问题。同时,针对最小哈密顿环问题,文章详细阐述了分支限界(Branch Bound)算法的实现。尽管通过剪枝可以提高效率,但算法在完全图中寻找最优解的时间复杂度仍高达O(n!)。
摘要由CSDN通过智能技术生成

问题描述:

(1)哈密顿环问题:输入是一个无向连通图G=(V,E);如果G中存在哈密顿环则输出该环。

(2)最小哈密顿环问题:输入是一个无向连通图G=(V,E),每个节点都没有到自身的边,每对节点间都有一条非负加权边;输出一个权值代价和最小的哈密顿环。注意:事实上输入图是一个完全图,因此哈密顿环是一定存在的。

实现哈密顿环搜索算法

(1)哈密顿环问题:(a)实现基于树的基本搜索算法(BFS,DFS) (b)爬山法

(2)最小哈密顿环问题:(a)实现求解最小哈密顿环问题的分支界限算法。

1.DFS

算法的主要步骤:


2.BFS

算法的主要步骤:


3.ClimbingHill

算法的主要步骤:


4.BranchBound

算法的主要原理:


源码:

Grap.h

/*
*Tree Search Strategy 15S103182 Ethan
*2015.12.1
*/
#include<iomanip>
#include<limits>
#include<time.h>
#include<stdlib.h>
#include<iostream>
#include<fstream>
using namespace std;

template<class E>  //E为图中边的权值的数据类型
class Graph {
	private:
		int maxVertices; //图中最大顶点数
		E **matrix;//邻接矩阵

	public:
		E maxWeight; //代表无穷大的值
		Graph(int sz);//创建SZ大小的基于邻接矩阵的图
		~Graph();//析构函数
		int NumberOfVertices() {
			return maxVertices;    //返回最大顶点数
		}
		E getWeight(int v1, int v2);     //取边(v1,v2)上的权值
		int getFirstNeighbor(int v);//取顶点v的第一个邻接顶点
		int getNextNeighbor(int v, int w);//取顶点v的邻接顶点W的下一个邻接顶点

		int Init(istream &in);//根据用户输入,获得图的邻接矩阵
		int RandInitN();//随机初始化图(无向图)
		int RandInit();//随机初始化图(完全无向图)
		int output(ostream &out); //输出图的矩阵到文件
		int output(); //输出图的矩阵到控制台
};

template<class E>
Graph<E>::Graph(int sz) { //创建SZ大小的基于邻接矩阵的图
	maxWeight = std::numeric_limits<E>::max();
	maxVertices = sz;
	matrix = new E *[sz];
	for (int i = 0; i<sz; i++) {
		matrix[i] = new E[sz];
		for (int j = 0; j<sz; j++) {
			matrix[i][j] = maxWeight;
		}
	}
}
template<class E>
Graph<E>::~Graph() {
	for (int i = 0; i<maxVertices; i++) {
		delete matrix[i];
	}
}
template<class E>
E Graph<E>::getWeight(int v1, int v2) { //取边(v1,v2)上的权值
	if (v1 >= 0 && v1<maxVertices&&v2 >= 0 && v2<maxVertices) {
		return matrix[v1][v2];
	}
	return 0;
}
template<class E>
int Graph<E>::getFirstNeighbor(int v) { //取顶点v的第一个邻接顶点
	if (!(v >= 0 && v<maxVertices))   //v不合法
		return -1;
	for (int col = 0; col<maxVertices; col++) {
		if (matrix[v][col] != maxWeight) {
			return col;          //找到
		}
	}
	return -1;                   //未找到
}
template<class E>
int Graph<E>::getNextNeighbor(int v, int w) { //取顶点v的邻接顶点W的下一个邻接顶点
	if (!(v >= 0 && v<maxVertices) || !(w >
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值