C语言哈密顿求最短距离

qq345912695 2014-12-05 12:51:54
问题描述:有一个推销员要到N个城市去推销产品,他从某个城市出发,经历每个城市,且每个城市只能去一次,然后回到初始城市,以距离作为代价,他希望找出一个最佳路径。这N个城市相互都有道路可通,但距离各不相同,城市个数和各个城市的相通距离可由学生自己设定。
基本要求:
(1) 可以输入城市个数(不少于10个)、输入城市信息和城市之间的距离(为整数);
(2) 按照输入出发城市,根据城市的距离最短给出路径选择。
(3) 界面要求:有合理的提示和人机交互。
#include <stdio.h>
int flag=0;/*用来标记回路是否检查完毕*/
int search(int distance[5][5],int start,int result[5]);
void next(int array[],int n);
void sort(int array[],int start,int end);
int dis_compute(int distance[5][5],int result[5]);
void chuli(int t_result[],int result[],int start,int n);

int main()
{
int i,j,start;/*start表示出发点城市编号*/
int distance[5][5]={{0,50,30,7,60},/*模拟城市之间的距离*/
{50,0,40,76,89},
{30,40,0,10,70},
{70,76,100,0,80},
{90,89,70,80,0}};
int result[5]={0};/*存放最短哈密顿回路*/
int dis_result=0;/*存放最短总距离*/
printf("\nThe distance of cities are as follows:\n");
for(i=0;i<5;i++)
{
for(j=0;j<=i;j++)
printf("%4d",distance[j]);
printf("\n\n");
}
printf("Please input the city number to start.Input -1 to exit.\n");
scanf("%d",&start);
while(start<-1||start>4)
{
printf("Sorry,you are wrong.\nPlease input the city number to start.Input -1 to exit.\n");
scanf("%d",&start);
}
if(start==-1)/*-1表示结束程序*/
{
printf("\nBye.Good luck!\n");
return;
}
printf("\nOK.Let's go!!!\n");
dis_result=search(distance,start,result);/*计算最短哈密顿回路,并求总距离*/
printf("\nThe best route is:\n");
for(i=0;i<5;i++)
printf("%4d->",result);
printf("%4d\n",result[0]);
printf("And the whole distance is:%d\n",dis_result);
}



int search(int distance[5][5],int start,int result[5])
{
int i,j;
int t_distance,r_distance;
int t_result[5]={0,1,2,3,4};
int r_result[5];
printf("\nI am in search function...........");
t_distance=r_distance=dis_compute(distance,t_result);
while(flag==0)
{
next(t_result,5);
chuli(t_result,r_result,start,5);
if((t_distance=dis_compute(distance,r_result))<r_distance)
{/*若当前回路总距离在检查过的回路中最小*/
r_distance=t_distance;
chuli(t_result,result,start,5);
}
}
printf("\nI am leaving search function...............");
return r_distance;
}



void next(int array[],int n)
{ /*计算下一个可能的回路,其实就是求排列*/
int i,j,temp;
printf("\nI am in next function..........................");
flag=0;
for(i=n-2;i>=0;i--)
if(array<array[i+1])
break;
for(j=n-1;j>i;j--)
if(array[j]>array)
break;
if(j==i)
{/*已是最后一条回路*/
flag=1;
return;
}
temp=array;
array=array[j];
array[j]=temp;
sort(array,i+1,n);
printf("\nI am leaving next function..........................");
}



void sort(int array[],int start,int end)
{
int i,j;
printf("\nI am in sort function...............................");
for(i=start;i<end-start;i++)
for(j=start;j<end-1;j++)
if(array[j]>array[j+1])
{
int t=array[j];
array[j]=array[j+1];
array[j+1]=t;
}
printf("\nI am leaving sort function...........................");
}



int dis_compute(int distance[5][5],int result[5])
{/*计算当前回路对应的总距离*/
int r_distance=0;
int i;
printf("\nI am in dis_compute function.........................");
for(i=0;i<5;i++)
r_distance+=distance[result][result[(i+1)%5]];
printf("\nI am leaving dis_compute function...................");
return r_distance;
}



void chuli(int t_result[],int result[],int start,int n)
{/*对选择的回路重新排列,按出发点---->路径---->出发点的顺序排列*/
int i,pos;
printf("\nI am in chuli function..............................");
for(i=0;i<n;i++)
if(t_result==start)
break;
pos=i;
for(i=0;i<n;i++)
result=t_result[(pos+i)%n];
printf("\nI am leaving chuli function.......................");
}

代码是网上找的,,运行不了,,求大神帮改改,,加点什么。
跪谢!~~
...全文
369 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
whizer 2014-12-05
  • 打赏
  • 举报
回复
自己调试一下,把错误信息发上来,大家会帮你改错.

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧