问题描述:
(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 >