回溯法求解哈密顿回路c++
时间: 2023-10-18 11:22:08 浏览: 198
回溯法求解哈密尔顿回路问题
5星 · 资源好评率100%
哈密顿回路问题是一个NP完全问题,目前还没有找到有效的多项式时间算法,因此我们只能使用回溯算法来求解。以下是使用C++实现的哈密顿回路问题的回溯算法:
```c++
#include <iostream>
using namespace std;
const int MAXN = 20; // 最大顶点数
int n; // 顶点数
int G[MAXN][MAXN]; // 图的邻接矩阵
int path[MAXN]; // 保存当前的哈密顿回路
bool visited[MAXN]; // 标记顶点是否已经被访问过
bool dfs(int u, int depth) {
if (depth == n) { // 找到了一个哈密顿回路
if (G[u][1]) { // 判断是否能够从最后一个顶点回到第一个顶点
path[depth] = 1; // 将第一个顶点加入回路中
return true;
}
else {
return false;
}
}
for (int v = 2; v <= n; v++) { // 枚举所有可能的下一个顶点
if (G[u][v] && !visited[v]) { // 如果存在边 (u,v) 并且顶点 v 没有被访问过
path[depth] = v; // 将顶点 v 加入回路中
visited[v] = true; // 标记顶点 v 已经被访问过
if (dfs(v, depth + 1)) { // 继续递归搜索下一个顶点
return true;
}
visited[v] = false; // 回溯,取消标记
}
}
return false;
}
void hamilton() {
for (int i = 1; i <= n; i++) {
visited[i] = false;
}
visited[1] = true; // 从第一个顶点开始搜索
path[1] = 1;
dfs(1, 2); // 从第一个顶点出发,已经有一个顶点在回路中了
}
int main() {
n = 5;
G[1][2] = G[2][1] = 1;
G[1][3] = G[3][1] = 1;
G[1][4] = G[4][1] = 1;
G[1][5] = G[5][1] = 1;
G[2][3] = G[3][2] = 1;
G[2][4] = G[4][2] = 1;
G[2][5] = G[5][2] = 1;
G[3][4] = G[4][3] = 1;
G[3][5] = G[5][3] = 1;
G[4][5] = G[5][4] = 1;
hamilton();
for (int i = 1; i <= n; i++) {
cout << path[i] << " ";
}
cout << endl;
return 0;
}
```
上面的代码实现了一个求解哈密顿回路的简单例子,可以自行修改顶点数和邻接矩阵来测试不同的情况。
阅读全文