设G=(V,E)是一个带权图。图中的各边的费用(权)为正数。图中的一条周游路线是包括V中的每个顶点在内的一条回路。周游路线的费用是这条路线上所有边的费用之和。旅行售货员问题是指在图G中找出费用最小的周游路线。如果找不到可行方案,则输出-1。 C语言实现
时间: 2023-11-22 18:55:48 浏览: 66
以下是旅行售货员问题的C语言实现,使用了贪心算法和邻接矩阵表示图:
```c
#include <stdio.h>
#include <limits.h>
#define MAXV 1000
int graph[MAXV][MAXV];
int visited[MAXV];
int V;
int minKey(int key[])
{
int min = INT_MAX, min_index;
for (int v = 0; v < V; v++)
if (visited[v] == 0 && key[v] < min)
min = key[v], min_index = v;
return min_index;
}
int tsp()
{
int parent[V];
int key[V];
for (int i = 0; i < V; i++)
key[i] = INT_MAX, visited[i] = 0;
key[0] = 0;
parent[0] = -1;
for (int count = 0; count < V - 1; count++)
{
int u = minKey(key);
visited[u] = 1;
for (int v = 0; v < V; v++)
if (graph[u][v] && visited[v] == 0 && graph[u][v] < key[v])
parent[v] = u, key[v] = graph[u][v];
}
int cost = 0;
for (int i = 1; i < V; i++)
if (!graph[parent[i]][i])
return -1;
else
cost += graph[parent[i]][i];
return cost + graph[parent[V - 1]][0];
}
int main()
{
scanf("%d", &V);
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
scanf("%d", &graph[i][j]);
int ans = tsp();
if (ans == -1)
printf("No feasible solution\n");
else
printf("Minimum cost of TSP is %d\n", ans);
return 0;
}
```
输入格式为:
```
V
v11 v12 ... v1V
v21 v22 ... v2V
...
vV1 vV2 ... vVV
```
其中V表示顶点数,vij表示第i个顶点到第j个顶点的边权值,如果不连通则为0。输出最小费用的周游路线长度,如果不存在则输出No feasible solution。
阅读全文