回溯法-旅行售货员问题(C语言)

1、旅行员售货问题

    问题描述

     某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。(必须从1号店出发,最后回到出发地)

#include   
#define N 4                //城市数目  
#define NO_PATH -1         //没有通路  
#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];            //最优路径  
//-----------------------------------------------------------------  
void Travel_Backtrack(int t)
{        //递归法  
    int i,j;  
    if(t>N)
	{                         //走完了,输出结果  
        for(i=1;i<=N;i++)            //输出当前的路径  
            printf("%d ",x[i]);
		printf("\n");
		bw = cw + City_Graph[x[N]][1]; //计算总权值(非最优) 
        if(bw < bestw) //挑选出最优总权值
		{              //判断当前路径是否是更优解  
            for (i=1;i<=N;i++)
			{  
                bestx[i] = x[i];  
            } 
			bestw = bw; 
        }  
        return;  
    }  
    else
	{  
        for(j=2;j<=N;j++)//因为出发点为1号,所以后面回溯时1号不满足后面的if条件
		{           //找到第t步能走的城市  
            if(City_Graph[x[t-1]][j] != NO_PATH && !isIn[j] /*&& cw


你可能感兴趣的:(随笔)