利用贪心算法求解旅行商问题,用C语言写出完整代码
时间: 2023-07-20 17:07:56 浏览: 115
以下是利用贪心算法求解旅行商问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define N 4
int graph[N][N] = { { 0, 10, 15, 20 },
{ 10, 0, 35, 25 },
{ 15, 35, 0, 30 },
{ 20, 25, 30, 0 } };
int visited[N] = { 0 };
int tour[N];
int length = INT_MAX;
void tsp(int curr, int depth, int cost) {
if (depth == N) {
if (cost + graph[curr][0] < length) {
length = cost + graph[curr][0];
// 保存路径
for (int i = 0; i < N; i++) {
printf("%d ", tour[i]);
}
printf("0\n");
}
return;
}
for (int i = 0; i < N; i++) {
if (!visited[i]) {
visited[i] = 1;
tour[depth] = i;
tsp(i, depth + 1, cost + graph[curr][i]);
visited[i] = 0;
}
}
}
int main() {
visited[0] = 1;
tour[0] = 0;
tsp(0, 1, 0);
printf("Length: %d\n", length);
return 0;
}
```
这段代码中,我们通过 `graph` 数组来表示旅行商问题中的图,`visited` 数组来记录哪些节点已经被访问过了,`tour` 数组来保存路径。在 `tsp` 函数中,我们将当前访问的节点 `curr` 和已经访问的深度 `depth` 作为参数传入,同时还有当前的路径代价 `cost`。如果 `depth` 已经等于节点数 `N`,说明已经访问完了所有节点,这时我们再加上从当前节点回到起点的代价,如果比之前记录的路径长度更短,就更新记录,并保存路径。否则,我们继续遍历未访问过的节点,直到访问完所有节点。最后输出记录的最短路径长度即可。
阅读全文