为带权路径进行加权最优规划,首先是时间问题,因为到达站点之后还要返回公司,所以时间最大为12小时,剩下要做的就是在12个小时内尽可能的使所有需要到达的站点获得的费用和最大。
应尽可能检索到所有可能的路径,所以的采用有向图的广度遍历来对所有路径进行检索。
select(站点数量n,穿梭使劲t,目的站点d,价值val){
for(对站点的所有临接站点进行遍历)
if(是否访问过){
若访问过则继续访问下一个,若没有访问则标记为访问过
判断价值是否为所有邻接表中的最优,若为最优则添加至路径,否则不添加
}
}
//------定义一个结构体(用来记录相邻两点坐标和距离)--------------
struct NUM{
double data;//距离
double left;//构成此距离的左数
double right;//构成此距离的右数
};//定义结构体数组
struct NUM L[20];//结构体数组20个
int J=0;//控制结构体数组的增加
//-------------------main()函数---------------------------------------------
int main()
{
int n;
double S[50];
// 在这里先输入数组的长度
//再输入S数组
sort(S,n);对S进行排序
double d=cpairl(S,0,n-1);//得到最短距离
PUT(L,d);//输出一维最接近的两点
}
//----------------对S进行排序--------------------------------
void sort(double S[],int n)//排序
{
int i,j;
double temp=0;
for(i=0;i
{
for( j=i+1;j
if(S[i]>=S[j])
{ temp=S[i];S[i]=S[j];S[j]=temp;}
}
}
//------------使用递归求最小距离值--------------------------
double min(double x,double y,double d)//三个数中得到最小的数
{
if(x<=y&&x<=d)return x;
if(y<=x&&y<=d)return y;
else return d;
}
double cpairl(double S[],int left,int right)
{
int n=right-left+1;
int t;
double m,sum=0;
if(n==1)//只剩一个数时,距离无穷大
{
L[J].left=S[left];
L[J].right=0;
L[J].data=1000;
return L[J++].data;
}
if(n==2)//剩两个数时,直接相减得到距离
{
L[J].left=S[left];
L[J].right=S[right];
L[J].data=S[right]-S[left];
return L[J++].data;
}
for(int i=left;i<=right;i++)
sum+=S[i];//全部坐标之和
m=sum/n;//各点坐标的中位数
cout<<"中位数:"<<m<<endl;
int i=left-1;
while(S[++i]<=m);//s[i-1]为m部分的开头
t=i;//将s分位两段的记号
double d1,d2;
d1=cpairl(S,left,t-1);//左半部分递归
d2= cpairl(S,t,right);//右半部分递归
double p=S[t-1];//左部分最接近m的值
double q=S[t];//右部分最接近m的值
double d=min(d1,d2,q-p);//q-p的值为中间的距离
return d;
}
//找到最近两点的坐标
void PUT(NUM L[],double d)//输出最小距离的L[].left和L[].right
{
int i=-1;
while(L[++i].data!=d);//直到L[].data==d时停止
//输出这两个值
}