-
问题描述
这个问题要求找出一条n个给定的城市间的最短路径,使我们在回到触发的城市之前,对每个城市都只访问一次。
-
解决方法
贪心选择法:每次都将剩余没有去过的城市依据与现在这个城市之间的距离进行排序,找出离现在这个城市距离最近的,然后去这个城市。
-
代码
/*
贪心算法
*/
#include <stdio.h>
# include <stdlib.h>
# include <time.h>
#define N 200 //城市数目
#define NO_PATH 0 //没有通路
#define MAX_WEIGHT 4000
int City_Graph[N+1][N+1]; //保存图信息
int x[N+1]; //x[i]保存第i步遍历的城市
int isIn[N+1]; //保存 城市i是否已经加入路径
int bestw; //最优路径总权值
int cw; //当前路径总权值
int bw; //深度搜索完成总权值
int bestx[N+1]; //最优路径
//-----------------------------------------------------------------
int main(void)
{
int i,j;
// 随机生成数
srand((unsigned)time(NULL));
for(i = 1; i <= N; i++) {
for(j = 1; j <= N; j++) {
int num = 0;
num = rand() % 201;
City_Graph[i][j] = num;
printf("%d ", City_Graph[i][j]);
}
}
//测试递归法,初始化
for (i=1;i<=N;i++)
{
x[i] = 0; //表示第i步还没有解
bestx[i] = 0; //还没有最优解
isIn[i] = 0; //表示第i个城市还没有加入到路径中
}
x[1] = 1; //第一步 走城市1
isIn[1] = 1; //第一个城市 加入路径
bestw = MAX_WEIGHT; // 因为要求最小值先设置为极大值
cw = 0; // 用于保存每一种可能的路径和值
for(i = 2; i <= N; i++) {// 此时i代表现在在选择第i个城市
int a = MAX_WEIGHT;// 保存剩余城市中的最短的路,因为求的是最短的路,所以这里初始化为极大值
int b = -1;// 保存准备选择的城市的序号
for (j = 1; j <= N; j++) {// 从第二个城市开始选择,看是不是最短的路,且未选择过
if(City_Graph[x[i-1]][j] < a && !isIn[j] && City_Graph[x[i-1]][j] != NO_PATH) {
a = City_Graph[x[i-1]][j];
b = j;
}
}
cw = cw + a;
isIn[b] = 1;
x[i] = b;
}
cw = cw + City_Graph[x[N]][1];
printf("最优值为%d\n",cw);
printf("最优解为:\n");
for(i=1;i<=N;i++)
{
printf("%d ",x[i]);
}
printf("\n");
return 0;
}