2018离散数学实验报告存档
旅行经销商问题
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int Addpace(int x[5]) //函数Addpace用来将权重相加
{
int n;
int addpace=0;
for(n=0;n<5;n++)
{
addpace+=x[n];
}
return addpace;
}
int conPace(int str[6])//conPace 函数用来比较各个城市的最短路,得出最优路
{
int m;
int min;//min存储比较值
min=100;
for(m=0;m<6;m++)
{
if(str[m]<min)
{
min=str[m];
}
}
return min;
}
void main(void)
{
printf("共有6个城市:a,b,c,d,e,f。城市间的距离分别为:a:0,6,7,2,9,16;b:6,0,3,11,12,15;c:7,3,0,9,18,5;d:2,11,9,0,13,18;e:9,12,18,13,0,13;f:16,15,5,18,13,0\n");
//定义六个城市
int i,j;//定义i表示前一个城市,j表示后一个城市
int pS;//pS存储出发城市
int pE;//pE存储到达城市
int t;//t为比较值,暂时存储最小权重
int k;
int add;
int bestpace;//bestpace存储最优路
int Dipace[6];//数组Dipace 存储 不同城市出发的最短路
int citypace[5];//citypace存储从不同城市出发的每一段路
for(i=0;i<6;i++)//从i开始循环,表示从不同城市出发
{
int flag[6]={0,0,0,0,0,0} ;//flag数组用来判断选择的城市是否已在最短路中,每次循环
pS=i;
flag[pS]=1;
int strCity[6][6]={{100,6,7,2,9,16},{6,100,3,11,12,15},{7,3,100,9,18,5},{2,11,9,100,13,18},{9,12,18,13,100,13},{16,15,5,18,13,100}};
//二维数组表示城市间的距离,城市本身的距离初始化为100,方便后期比较大小,取最短路,每次从 不同城市出发初始化
printf("从%c->",i+97);
for(k=0;k<5;k++)//第二层循环k,储存城市之间最小权重
{
t=100; //初始化比较值
for(j=0;j<6;j++)//第三层循环j,挑选距离上一个城市最短的城市
{
if(strCity[pS][j]<=t)
{
if(flag[j]==0)
{
t=strCity[pS][j];
citypace[k]=t;
pE=j;
}
else
{
continue;
}
}
}
printf("%c->",pE+97);
flag[pE]=1; //使到达城市标记为1;下次循环时排除
strCity[pE][pS]=strCity[pS][pE]=200;//改变flag为1的城市之间的距离,方便找出下一个城市
pS=pE;//起始城市改变
}
printf("%c ",i+97);
add=Addpace(citypace);
Dipace[i]=add+strCity[pE][i];//把此次循环得到的每一段路相加,得到从I城市出发的最短路
printf("从%c开始最短路为%d\n",i+97,Dipace[i]);
citypace[0]=citypace[1]=citypace[2]=citypace[3]=citypace[4]=0;//初始化city pace数组,储存下一次i循环的城市间的距离
}
bestpace=conPace(Dipace);//得到最优路长度
printf("最优路长度为%d",bestpace);
}
运行结果: