2007数学建模B题算法与实现源程序
2007-10-28 23:02
489 查看
求解从起点到终点最大换乘次数为的最优线路的基本步骤如下:
步骤(1): 如果起点 和 终点在同一条线路上,求出起点到 终点的局部最优解,,并与最优解比较,更新最优解。
步骤(2): 分别找出所有的经过 起点和 终点的线路的两个集合 L1和L2 ,遍历其站点交集中每个站点p ,分别对起点 到p 和 p到 终点调用步骤(1),连接两者返回的结果得到局部最优解,并与最优解比较,做出取舍,更新最优解。
步骤(3): 对 L1集合中每条线路上的每个站 p,分别对起点 到p 调用步骤(1),对 p到终点 调用步骤(2),连接返回值得到局部最优解,并与最优解比较,更新最优解。
步骤(N ): 对 L1集合中每条线路上的每个点 p,对 起点到p 调用步骤(1),对 p到 终点调用步骤(N-1 ), 连接两者返回值得到局部最优解,并与最优解比较,更新最优解。
在算法编程实现时,通过使用哈希表和以空间复杂度换取时间复杂度的办法以优化算法.
源程序
//Cbus.h
#include<fstream>
#include<vector>
using namespace std;
extern int Station[3958];
struct Cost
...{
int bus;
int station;
int cost;
int time;
};
struct SmallCost
...{
int cost;
int time;
};
struct DotLine
...{
int station;
vector<int>bus;
};
extern vector<DotLine> Bus_train;
ostream &operator<<(ostream &fcout,Cost &cost);
class Bus
...{
public:
int m_num;
int m_cost;
int m_station[150];
int m_flag;
Bus();
int isexist(int p);
void rdouble(istream &fcin);
void rsingle(istream &fcin);
int getother(int p);
void Result(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co );
};
class Result
...{
public:
Bus m_bus[520];
void subway(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,
SmallCost &ti,SmallCost &co);
int getmaxs();
Result();
void getResult(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,
SmallCost &ti,SmallCost &co);
void getResult1(int p1,int p2,vector<int> line1,vector<int> line2,
vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co);
void getResult2(int p1,int p2,vector<int> line1,vector<int> line2,
vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co);
vector<DotLine> getDotline(const Bus &b);
};
vector<int> hash_cross(const Bus &b1,const Bus &b2);
vector<int> hash_cross(const Bus &b);
//bus.cpp
#include<iostream>
#include"Cbus.h"
#include<math.h>
using namespace std;
extern vector<DotLine> Bus_train;
Bus::Bus()
...{
this->m_num=0;
this->m_cost=0;
this->m_flag=0;
}
void Bus::rdouble(istream &fcin)
...{
int i=1;
while(fcin>>m_station[i])
...{
if(1==m_station[i])
break;
m_station[i]=m_station[i]-10000;
i++;
}
m_station[0]=i-1;
i++;
while(fcin>>m_station[i])
...{
if(0==m_station[i])
break;
m_station[i]=m_station[i]-10000;
i++;
}
m_station[m_station[0]+1]=i-m_station[0]-2;
}
void Bus::rsingle(istream &fcin)
...{
int i=1;
if(m_flag!=2)
...{
m_station[1]=m_flag-10000;
m_flag=1;
i++;
}
while(fcin>>m_station[i])
...{
if(0==m_station[i])
break;
m_station[i]=m_station[i]-10000;
i++;
}
m_station[0]=i-1;
}
int Bus::isexist(int p)
...{
int i=0;
if(0==this->m_flag)
...{
for(i=1;i<=this->m_station[0];i++)
...{
if(p==m_station[i])
return i;
}
int temp=i+m_station[i];
i++;
for(i;i<=temp;i++)
...{
if(p==m_station[i])
return i;
}
}
else
...{
for(i=1;i<=this->m_station[0];i++)
if(p==m_station[i])
return i;
}
return 0;
}
int Bus::getother(int p)
...{
if(p>m_station[0])
return 0;
for(int i=m_station[0]+1;i<m_station[0]+m_station[m_station[0]+1]+2;i++)
if(m_station[i]==m_station[p])
...{
return i;
}
return 0;
}
void Bus::Result(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co)
...{
int q1,q2;
switch(m_flag)
...{
case 0:
q1=getother(p1);
q2=getother(p2);
if(p1>p2&&p2>m_station[0])
return;
if(p1>p2&&p1<m_station[0]&&q1==0&&q2==0)
return;
if( p1<p2 && ( p2<=m_station[0] || p1>=m_station[0] || (q1!=0&&q1<p2) )|| p1>p2&&q2>p1)
...{
if(p1>p2)
p2=q2;
if(q1!=0&&q1<p2)
p1=q1;
Cost c;
c.bus=m_num;
c.station=m_station[p2];
c.time=abs((p2-p1))*3;
if(m_cost)
c.cost=1;
else
...{
c.cost=(abs(p2-p1)-1)/20+1;
c.cost=c.cost>3?3:c.cost;
}
if(c.cost<co.cost||(c.cost==co.cost && (Rc.size()>1 || c.time<co.time)))
...{
Rc.clear();
Rc.push_back(c);
co.cost=c.cost;
co.time=c.time;
}
if(c.time<ti.time||(c.time==ti.time && (Rt.size()>1 || c.cost<ti.cost)))
...{
Rt.clear();
Rt.push_back(c);
ti.time=c.time;
ti.cost=c.cost;
return;
}
}
else
...{
if(p1>p2)
...{
if(p1<m_station[0])
p1=q1;
Cost c;
Cost d;
c.bus=m_num;
c.station=m_station[1];
c.time=(m_station[0]+m_station[m_station[0]+1]+1-p1)*3;
d.bus=m_num;
d.station=m_station[p2];
d.time=abs(p2-1)*3;
if(m_cost)
...{
d.cost=1;
c.cost=1;
}
else
...{
d.cost=(d.time/3-1)/20+1;
c.cost=(c.time/3-1)/20+1;
d.cost=d.cost>3?3:d.cost;
c.cost=c.cost>3?3:d.cost;
}
if(c.time+d.time+5<ti.time||(c.time+d.time+5==ti.time&&c.cost+d.cost<ti.cost))
...{
Rt.clear();
Rt.push_back(c);
Rt.push_back(d);
ti.time=c.time+d.time+5;
ti.cost=c.cost+d.cost;
}
if(c.cost+d.cost<co.cost||(c.cost+d.cost==co.cost)&&c.time+d.time+5<co.time)
...{
Rc.clear();
Rc.push_back(c);
Rc.push_back(d);
co.cost=c.cost+d.cost;
co.time=c.time+d.time+5;
}
return;
}
Cost c;
Cost d;
c.bus=m_num;
c.station=m_station[m_station[0]];
c.time=abs(m_station[0]-p1)*3;
d.bus=m_num;
d.station=m_station[p2];
d.time=abs(p2-m_station[0]-1)*3;
if(m_cost)
...{
d.cost=1;
c.cost=1;
}
else
...{
d.cost=(d.time/3-1)/20+1;
c.cost=(c.time/3-1)/20+1;
d.cost=d.cost>3?3:d.cost;
c.cost=c.cost>3?3:d.cost;
}
if(c.time+d.time+5<ti.time||(c.time+d.time+5==ti.time&&c.cost+d.cost<ti.cost))
...{
Rt.clear();
Rt.push_back(c);
Rt.push_back(d);
ti.time=c.time+d.time+5;
ti.cost=c.cost+d.cost;
}
if(c.cost+d.cost<co.cost||(c.cost+d.cost==co.cost)&&c.time+d.time+5<co.time)
...{
Rc.clear();
Rc.push_back(c);
Rc.push_back(d);
co.cost=c.cost+d.cost;
co.time=c.time+d.time+5;
}
return;
}
break;
case 1:
Cost c;
c.bus=m_num;
c.station=m_station[p2];
c.time=abs(p2-p1)*3;
if(m_cost)
c.cost=1;
else
...{
c.cost=(abs(p2-p1)-1)/20+1;
c.cost=c.cost>3?3:c.cost;
}
if(c.cost<co.cost||(c.cost==co.cost && (Rc.size()>1 || c.time<co.time)))
...{
Rc.clear();
Rc.push_back(c);
co.cost=c.cost;
co.time=c.time;
}
if(c.time<ti.time||(c.time==ti.time && (Rt.size()>1 || c.cost<ti.cost)))
...{
Rt.clear();
Rt.push_back(c);
ti.time=c.time;
ti.cost=c.cost;
return;
}
break;
case 2:
int temp=abs(p1-p2);
c.bus=m_num;
c.station=m_station[p2];
c.time=temp*3;
if(m_station[p1]==m_station[1])
...{
c.time=(p2-1<m_station[0]-p2?(p2-1)*3:abs(m_station[0]-p2)*3);
}
if(m_station[p2]==m_station[1])
...{
c.time=(p1-1<m_station[0]-p1?(p1-1)*3:abs(m_station[0]-p1)*3);
}
if(m_cost)
c.cost=1;
else
...{
c.cost=(c.time/3-1)/20+1;
c.cost=c.cost>3?3:c.cost;
}
if(c.cost<co.cost||(c.cost==co.cost && (Rc.size()>1 || c.time<co.time)))
...{
Rc.clear();
Rc.push_back(c);
co.cost=c.cost;
co.time=c.time;
}
if(c.time<ti.time||(c.time==ti.time && (Rt.size()>1 || c.cost<ti.cost)))
...{
Rt.clear();
Rt.push_back(c);
ti.time=c.time;
ti.cost=c.cost;
}
if(p1==1||p2==1)
return;
int min=p2;
Cost d;
if(p1<p2)
...{
p2=p1;
p1=min;
c.time=(p2-1)*3;
d.time=abs(m_station[0]-p1)*3;
}
else
...{
c.time=abs(m_station[0]-p1)*3;
d.time=(p2-1)*3;
}
c.station=m_station[1];
d.bus=c.bus;
d.station=m_station[min];
if(m_cost)
...{
c.cost=d.cost=1;
}
else
...{
d.cost=(d.time/3-1)/20+1;
c.cost=(c.time/3-1)/20+1;
d.cost=d.cost>3?3:d.cost;
c.cost=c.cost>3?3:d.cost;
}
if(c.time+d.time+5<ti.time||(c.time+d.time+5==ti.time&&c.cost+d.cost<ti.cost))
...{
Rt.clear();
Rt.push_back(c);
Rt.push_back(d);
ti.time=c.time+d.time+5;
ti.cost=c.cost+d.cost;
}
if(c.cost+d.cost<co.cost||(c.cost+d.cost==co.cost)&&c.time+d.time+5<co.time)
...{
Rc.clear();
Rc.push_back(c);
Rc.push_back(d);
co.cost=c.cost+d.cost;
co.time=c.time+d.time+5;
}
return;
break;
}
}
void Result::getResult(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,
SmallCost &ti,SmallCost &co)
...{
vector<int> line1,line2;
int flag=0,temp1=0,temp2=0;
ti.cost=ti.time=co.cost=co.time=999999999;
if(Station[p1]&&Station[p2])
subway(p1,p2,Rt,Rc,ti,co);
for(int i=0;i<520;i++)
...{
temp1=m_bus[i].isexist( p1 );
if(temp1)
...{
line1.push_back(i);
flag=1;
}
temp2=m_bus[i].isexist(p2);
if(temp2)
...{
line2.push_back(i);
if(flag==1)
m_bus[i].Result(temp1,temp2,Rt,Rc,ti,co);
}
flag=0;
}
if(Station[p1])
line1.push_back(1000);
if(Station[p2])
line2.push_back(1000);
getResult1(p1,p2,line1,line2,Rt,Rc,ti,co);
getResult2(p1,p2,line1,line2,Rt,Rc,ti,co);
}
void Result::getResult1(int p1,int p2,vector<int> line1,vector<int> line2,
vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co)
...{
int i=0,j=0;
for(i=0;i<line1.size();i++)
for(j=0;j<line2.size();j++)
...{
if(line1.at(i)==line2.at(j))
continue;
vector<int> cross;
if(line1.at(i)<520&&line2.at(j)<520)
cross=hash_cross( m_bus[line1.at(i)], m_bus[line2.at(j)] );
else
...{
if(line1.at(i)>520)
cross=hash_cross(m_bus[line2.at(j)]);
else
cross=hash_cross(m_bus[line1.at(i)]);
}
if(cross.size()==0)
continue;
for(int k=0;k<cross.size();k++)
...{
int cro=cross.at(k);
int change_cost;
change_cost=5;
SmallCost t1=...{999999999,999999999};
SmallCost t2,c1,c2;
t2=c1=c2=t1;
vector<Cost> Rc1,Rc2,Rt1,Rt2;
int num1=line1.at(i),num2=line2.at(j);
if(num1==num2||p2==cro||p1==cro)
continue;
if(num1<520&&num2<520)
...{
m_bus[num1].Result(m_bus[num1].isexist(p1),m_bus[num1].isexist(cro),
Rt1,Rc1,t1,c1);
m_bus[num2].Result(m_bus[num2].isexist(cro),m_bus[num2].isexist(p2),
Rt2,Rc2,t2,c2);
change_cost=5;
}
if(num1==1000)
...{
change_cost=7;
subway(p1,cro,Rt1,Rc1,t1,c1);
m_bus[num2].Result(m_bus[num2].isexist(cro),m_bus[num2].isexist(p2),
Rt2,Rc2,t2,c2);
if(Rt1.at(0).bus<0)
change_cost=3;
}
if(num2==1000)
...{
m_bus[num1].Result(m_bus[num1].isexist(p1),m_bus[num1].isexist(cro),
Rt1,Rc1,t1,c1);
subway(cro,p2,Rt2,Rc2,t2,c2);
change_cost=6;
if(Rt2.at(0).bus<0)
change_cost=0;
}
if(t1.time==12)
...{
t1.time=12;
}
if(t1.time+t2.time+change_cost<ti.time||((t1.time+t2.time+change_cost==ti.time)&&t1.cost+t2.cost<ti.cost))
...{
int n=0;
Rt.clear();
for(n=0;n<Rt1.size();n++)
Rt.push_back(Rt1.at(n));
for(n=0;n<Rt2.size();n++)
Rt.push_back(Rt2.at(n));
ti.cost=t1.cost+t2.cost;
ti.time=t1.time+t2.time+change_cost;
}
if(c1.cost+c2.cost<co.cost||((c1.cost+c2.cost==co.cost)&&c1.time+c2.time+change_cost<co.time))
...{
int n=0;
Rc.clear();
for(n=0;n<Rc1.size();n++)
Rc.push_back(Rc1.at(n));
for(n=0;n<Rc2.size();n++)
Rc.push_back(Rc2.at(n));
co.cost=c1.cost+c2.cost;
co.time=c1.time+c2.time+change_cost;
}
Rc1.clear();
Rc2.clear();
Rt1.clear();
Rt2.clear();
t1.cost=t2.cost=c1.cost=c2.cost=999999999;
t1.time=t2.time=c1.time=c2.time=999999999;
}
}
}
void Result::getResult2(int p1,int p2,vector<int> line1,vector<int> line2,
vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co)
...{
int i=0,j=0;
for(i=0;i<line1.size();i++)
...{
vector<DotLine>Dot;
if(line1.at(i)==1000)
Dot=Bus_train;
else
Dot=getDotline(m_bus[line1.at(i)]);
for(j=0;j<Dot.size();j++)
...{
int change_cost1,change_cost2;
change_cost1=change_cost2=5;
int dot;
dot=Dot.at(j).station;
int num=line1.at(i);
if(p1==dot||p2==dot)
continue;
SmallCost t1=...{999999999,999999999};
SmallCost t2,c1,c2;
t2=c1=c2=t1;
vector<Cost> Rc1,Rc2,Rt1,Rt2;
if(num==1000)
...{
subway(p1,dot,Rt1,Rc1,t1,c1);
change_cost1=change_cost2=7;
}
else
m_bus[num].Result(m_bus[num].isexist(p1),
m_bus[num].isexist(dot),Rt1,Rc1,t1,c1);
getResult1(dot,p2,Dot.at(j).bus,line2,Rt2,Rc2,t2,c2);
if(Rt1.size()>0&&Rt1.at(0).bus<0)
change_cost1=3;
if(Rt2.size()>0&&Rt2.at(0).bus>=1000)
change_cost1=6;
if(Rc1.size()>0&&Rc1.at(0).bus<0)
change_cost2=3;
if(Rc2.size()>0&&Rc2.at(0).bus>=1000)
change_cost2=6;
if((t1.time+t2.time+change_cost1<ti.time||((t1.time+t2.time+change_cost1==ti.time)&&t1.cost+t2.cost<ti.cost))&&t2.cost<99999999)
...{
int n=0;
Rt.clear();
for(n=0;n<Rt1.size();n++)
Rt.push_back(Rt1.at(n));
for(n=0;n<Rt2.size();n++)
Rt.push_back(Rt2.at(n));
ti.cost=t1.cost+t2.cost;
ti.time=t1.time+t2.time+change_cost1;
}
if((c1.cost+c2.cost<co.cost||((c1.cost+c2.cost==co.cost)&&c1.time+c2.time+change_cost2<co.time))&&c2.cost<99999999)
...{
int n=0;
Rc.clear();
for(n=0;n<Rc1.size();n++)
Rc.push_back(Rc1.at(n));
for(n=0;n<Rc2.size();n++)
Rc.push_back(Rc2.at(n));
co.cost=c1.cost+c2.cost;
co.time=c1.time+c2.time+change_cost2;
}
Rc1.clear();
Rc2.clear();
Rt1.clear();
Rt2.clear();
t1.cost=t2.cost=c1.cost=c2.cost=999999999;
t1.time=t2.time=c1.time=c2.time=999999999;
}
}
}
vector<DotLine> Result::getDotline(const Bus &b)
...{
vector<DotLine>Dot;
int i=1;
for(i=1;i<=b.m_station[0];i++)
...{
DotLine dl;
dl.station=b.m_station[i];
for(int j=0;j<520;j++)
...{
if( m_bus[j].isexist(b.m_station[i]) )
dl.bus.push_back(j);
}
Dot.push_back(dl);
}
if(b.m_flag==0)
...{
for(i=b.m_station[0]+1;i<b.m_station[0]+b.m_station[b.m_station[0]+1]+2;i++)
...{
DotLine dl;
dl.station=b.m_station[i];
for(int j=0;j<520;j++)
...{
if( m_bus[i].isexist(b.m_station[i]) )
dl.bus.push_back(i);
}
Dot.push_back(dl);
}
}
return Dot;
}
SmallCost get_SmallCost(vector<Cost> &V)
...{
SmallCost cost;
if(V.size()!=0)
...{
cost.cost=V.at(0).cost;
cost.time=V.at(0).time;
}
for(int i=1;i<V.size();i++)
...{
cost.time=cost.time+V.at(i).time+5;
cost.cost=cost.cost+V.at(i).cost;
}
return cost;
}
vector<int> hash_cross(const Bus &b)
...{
vector<int> cross;
int i=1;
for(i=1;i<=b.m_station[0];i++)
...{
if(Station[b.m_station[i]])
cross.push_back(b.m_station[i]);
}
if(b.m_flag==0)
...{
for(i=b.m_station[0]+2;i<b.m_station[0]+b.m_station[b.m_station[0]+1]+2;i++)
if(Station[b.m_station[i]])
...{
for(int k=0;k<cross.size();k++)
...{
if(cross.at(k)==b.m_station[i])
break;
}
if(k==cross.size())
cross.push_back(b.m_station[i]);
}
}
return cross;
}
vector<int> hash_cross(const Bus &b1,const Bus &b2)
...{
vector<int> cross;
bool hash[3957]=...{0};
int i=0;
for(i=1;i<=b1.m_station[0];i++)
hash[b1.m_station[i]]=1;
if(b1.m_flag==0)
for(i=b1.m_station[0]+2;i<b1.m_station[0]+b1.m_station[b1.m_station[0]+1]+2;i++)
hash[b1.m_station[i]]=1;
for(i=1;i<=b2.m_station[0];i++)
...{
if(hash[b2.m_station[i]])
...{
for(int k=0;k<cross.size();k++)
...{
if(cross.at(k)==b2.m_station[i])
break;
}
if(k==cross.size())
cross.push_back(b2.m_station[i]);
}
}
if(b2.m_flag==0)
...{
for(i=b2.m_station[0]+2;i<b2.m_station[0]+b2.m_station[b2.m_station[0]+1]+2;i++)
...{
if(hash[b2.m_station[i]])
...{
int k=0;
for(k=0;k<cross.size();k++)
...{
if(cross.at(k)==b2.m_station[i])
break;
}
if(k==cross.size())
cross.push_back(b2.m_station[i]);
}
}
}
return cross;
}
istream &operator>>(istream &fcin,Bus &bus)
...{
fcin>>bus.m_num;
fcin>>bus.m_cost;
fcin>>bus.m_flag;
if(bus.m_flag==0)
bus.rdouble(fcin);
else
bus.rsingle(fcin);
return fcin;
}
ostream &operator<<(ostream &fcout,Cost &cost)
...{
fcout<<cost.bus<<" "<<cost.station<<" "<<cost.cost<<" "<<cost.time<<endl;
return fcout;
}
Result::Result()
...{
ifstream file("L.txt");
if(!file)
...{
cout<<"文件打开失败"<<endl;
return;
}
for(int i=0;i<520;i++)
file>>m_bus[i];
file.close();
file.open("D.txt");
if(!file)
...{
cout<<"文件打开失败"<<endl;
return;
}
int num=0,data=0;
file>>num;
while(file>>data)
...{
if(data==0)
...{
file>>num;
continue;
}
Station[data]=num;
}
}
int Result::getmaxs()
...{
int max=0;
for(int i=0;i<520;i++)
...{
int n=0;
if(m_bus[i].m_flag==0)
n=m_bus[i].m_station[0]+m_bus[i].m_station[m_bus[i].m_station[0]+1]+1;
else
n=m_bus[i].m_station[0];
for(int j=0;j<n;j++)
if(max<m_bus[i].m_station[j])
max=m_bus[i].m_station[j];
}
return max;
}
void Result::subway(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,
SmallCost &ti,SmallCost &co)
...{
Rt.clear();
Rc.clear();
Cost cost;
int save=p2;
if(Station[p1]==0&&Station[p2]==0)
return;
p1=Station[p1];
p2=Station[p2];
if(p1==p2)
...{
cost.bus=-p1;
cost.cost=0;
cost.time=8;
cost.station=save;
Rt.push_back(cost);
Rc.push_back(cost);
ti.cost=co.cost=0;
ti.time=co.time=8;
return;
}
if( (p1<24&&p2<24) || (p1>23&&p2>23) ||p1==12
|| p2==12 || p1==18 || p2==18)
...{
if(p1<24&&p2<24)
...{
cost.bus=1000;
cost.cost=3;
cost.station=p2;
cost.time=abs(p2-p1)*2.5;
Rt.push_back(cost);
Rc.push_back(cost);
ti.cost=co.cost=3;
ti.time=co.time=cost.time;
return;
}
cost.station=p2;
p1=(p1>26?p1+1:p1);
p1=(p1>33?p1+1:p1);
p2=(p2>26?p2+1:p2);
p2=(p2>33?p2+1:p2);
p1=(p1==12?27:p1);
p2=(p2==12?27:p2);
p1=(p1==18?34:p1);
p2=(p2==18?34:p2);
cost.bus=1001;
int tt=abs(p1-p2);
tt=(tt>9?tt=18-tt:tt);
cost.time=tt*2.5;
cost.cost=3;
Rt.push_back(cost);
Rc.push_back(cost);
co.cost=ti.cost=3;
co.time=ti.time=cost.time;
return;
}
else
...{
int temp1=p1,temp2=p2;
int core=0;
temp1=p1>p2?temp1:p2;
temp2=p1>p2?temp2:p1;
if(temp1<27||temp2<12)
core=12;
if(temp1>32||temp2>18)
core=18;
if(core==0)
...{
temp1=33-temp1+18;
if(temp1-temp2>=7)
core=12;
else
core=18;
}
Cost cost2;
if(p1>p2)
...{
cost.bus=1001;
cost2.bus=1000;
if(core==18)
if(p1>32)
cost.time=abs(p1-32)*2.5;
else
cost.time=abs(p1-33)*2.5;
else
if(p1>26)
cost.time=abs(p1-26)*2.5;
else
cost.time=abs(p1-27)*2.5;
cost2.time=abs(p2-core)*2.5;
}
else
...{
cost.time=abs(core-p1)*2.5;
cost.bus=1000;
cost2.bus=1001;
if(core==18)
cost2.time=(abs(p2-32.5)+0.5)*2.5;
else
cost2.time=(abs(p2-26.5)+0.5)*2.5;
}
cost.cost=3;
cost.station=core;
cost2.cost=0;
cost2.station=p2;
Rt.push_back(cost);
Rc.push_back(cost2);
ti.cost=co.cost=3;
ti.time=co.time=cost.time+cost2.time+4;
}
}
//Mbus.cpp
#include"Cbus.h"
#include<iostream>
using namespace std;
int Station[3958]=...{0};
vector<DotLine> Bus_train;
int main()
...{
vector<Cost> Rt,Rc,Rd;
Result R;
for(int i=1;i<3958;i++)
if(Station[i])
...{
DotLine dl;
dl.station=i;
for(int j=0;j<520;j++)
...{
if( R.m_bus[j].isexist(i))
dl.bus.push_back(j);
}
Bus_train.push_back(dl);
}
SmallCost time,cost,disp;
int p1,p2;
while(1)
...{
cout<<"请输入两个公交站点"<<endl;
cin>>p1;
if(p1==0)
break;
cin>>p2;
if(p1==p2)
...{
cout<<"输入有误,相同的两个站点"<<endl;
continue;
}
R.getResult(p1,p2,Rt,Rc,time,cost);
cout<<"时间最短路线"<<endl;
cout<<"车次 中转站 花费 时间(分)"<<endl;
for(int i=0;i<Rt.size();i++)
...{
cout<<Rt.at(i)<<endl;
}
if(Rt.size()==0)
cout<<"没有找到时间最短线路"<<endl;
else
cout<<"总时间:"<<time.time<<" 总费用:"<<time.cost<<endl;
cout<<"费用最少路线"<<endl;
cout<<"车次 下站 花费 时间(分)"<<endl;
for(i=0;i<Rc.size();i++)
...{
cout<<Rc.at(i)<<endl;
}
if(Rc.size()==0)
cout<<"没有找到费用最少线路"<<endl;
else
cout<<"总时间:"<<cost.time<<" 总费用:"<<cost.cost<<endl;
Rc.clear();
Rt.clear();
}
return 0;
}
步骤(1): 如果起点 和 终点在同一条线路上,求出起点到 终点的局部最优解,,并与最优解比较,更新最优解。
步骤(2): 分别找出所有的经过 起点和 终点的线路的两个集合 L1和L2 ,遍历其站点交集中每个站点p ,分别对起点 到p 和 p到 终点调用步骤(1),连接两者返回的结果得到局部最优解,并与最优解比较,做出取舍,更新最优解。
步骤(3): 对 L1集合中每条线路上的每个站 p,分别对起点 到p 调用步骤(1),对 p到终点 调用步骤(2),连接返回值得到局部最优解,并与最优解比较,更新最优解。
步骤(N ): 对 L1集合中每条线路上的每个点 p,对 起点到p 调用步骤(1),对 p到 终点调用步骤(N-1 ), 连接两者返回值得到局部最优解,并与最优解比较,更新最优解。
在算法编程实现时,通过使用哈希表和以空间复杂度换取时间复杂度的办法以优化算法.
源程序
//Cbus.h
#include<fstream>
#include<vector>
using namespace std;
extern int Station[3958];
struct Cost
...{
int bus;
int station;
int cost;
int time;
};
struct SmallCost
...{
int cost;
int time;
};
struct DotLine
...{
int station;
vector<int>bus;
};
extern vector<DotLine> Bus_train;
ostream &operator<<(ostream &fcout,Cost &cost);
class Bus
...{
public:
int m_num;
int m_cost;
int m_station[150];
int m_flag;
Bus();
int isexist(int p);
void rdouble(istream &fcin);
void rsingle(istream &fcin);
int getother(int p);
void Result(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co );
};
class Result
...{
public:
Bus m_bus[520];
void subway(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,
SmallCost &ti,SmallCost &co);
int getmaxs();
Result();
void getResult(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,
SmallCost &ti,SmallCost &co);
void getResult1(int p1,int p2,vector<int> line1,vector<int> line2,
vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co);
void getResult2(int p1,int p2,vector<int> line1,vector<int> line2,
vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co);
vector<DotLine> getDotline(const Bus &b);
};
vector<int> hash_cross(const Bus &b1,const Bus &b2);
vector<int> hash_cross(const Bus &b);
//bus.cpp
#include<iostream>
#include"Cbus.h"
#include<math.h>
using namespace std;
extern vector<DotLine> Bus_train;
Bus::Bus()
...{
this->m_num=0;
this->m_cost=0;
this->m_flag=0;
}
void Bus::rdouble(istream &fcin)
...{
int i=1;
while(fcin>>m_station[i])
...{
if(1==m_station[i])
break;
m_station[i]=m_station[i]-10000;
i++;
}
m_station[0]=i-1;
i++;
while(fcin>>m_station[i])
...{
if(0==m_station[i])
break;
m_station[i]=m_station[i]-10000;
i++;
}
m_station[m_station[0]+1]=i-m_station[0]-2;
}
void Bus::rsingle(istream &fcin)
...{
int i=1;
if(m_flag!=2)
...{
m_station[1]=m_flag-10000;
m_flag=1;
i++;
}
while(fcin>>m_station[i])
...{
if(0==m_station[i])
break;
m_station[i]=m_station[i]-10000;
i++;
}
m_station[0]=i-1;
}
int Bus::isexist(int p)
...{
int i=0;
if(0==this->m_flag)
...{
for(i=1;i<=this->m_station[0];i++)
...{
if(p==m_station[i])
return i;
}
int temp=i+m_station[i];
i++;
for(i;i<=temp;i++)
...{
if(p==m_station[i])
return i;
}
}
else
...{
for(i=1;i<=this->m_station[0];i++)
if(p==m_station[i])
return i;
}
return 0;
}
int Bus::getother(int p)
...{
if(p>m_station[0])
return 0;
for(int i=m_station[0]+1;i<m_station[0]+m_station[m_station[0]+1]+2;i++)
if(m_station[i]==m_station[p])
...{
return i;
}
return 0;
}
void Bus::Result(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co)
...{
int q1,q2;
switch(m_flag)
...{
case 0:
q1=getother(p1);
q2=getother(p2);
if(p1>p2&&p2>m_station[0])
return;
if(p1>p2&&p1<m_station[0]&&q1==0&&q2==0)
return;
if( p1<p2 && ( p2<=m_station[0] || p1>=m_station[0] || (q1!=0&&q1<p2) )|| p1>p2&&q2>p1)
...{
if(p1>p2)
p2=q2;
if(q1!=0&&q1<p2)
p1=q1;
Cost c;
c.bus=m_num;
c.station=m_station[p2];
c.time=abs((p2-p1))*3;
if(m_cost)
c.cost=1;
else
...{
c.cost=(abs(p2-p1)-1)/20+1;
c.cost=c.cost>3?3:c.cost;
}
if(c.cost<co.cost||(c.cost==co.cost && (Rc.size()>1 || c.time<co.time)))
...{
Rc.clear();
Rc.push_back(c);
co.cost=c.cost;
co.time=c.time;
}
if(c.time<ti.time||(c.time==ti.time && (Rt.size()>1 || c.cost<ti.cost)))
...{
Rt.clear();
Rt.push_back(c);
ti.time=c.time;
ti.cost=c.cost;
return;
}
}
else
...{
if(p1>p2)
...{
if(p1<m_station[0])
p1=q1;
Cost c;
Cost d;
c.bus=m_num;
c.station=m_station[1];
c.time=(m_station[0]+m_station[m_station[0]+1]+1-p1)*3;
d.bus=m_num;
d.station=m_station[p2];
d.time=abs(p2-1)*3;
if(m_cost)
...{
d.cost=1;
c.cost=1;
}
else
...{
d.cost=(d.time/3-1)/20+1;
c.cost=(c.time/3-1)/20+1;
d.cost=d.cost>3?3:d.cost;
c.cost=c.cost>3?3:d.cost;
}
if(c.time+d.time+5<ti.time||(c.time+d.time+5==ti.time&&c.cost+d.cost<ti.cost))
...{
Rt.clear();
Rt.push_back(c);
Rt.push_back(d);
ti.time=c.time+d.time+5;
ti.cost=c.cost+d.cost;
}
if(c.cost+d.cost<co.cost||(c.cost+d.cost==co.cost)&&c.time+d.time+5<co.time)
...{
Rc.clear();
Rc.push_back(c);
Rc.push_back(d);
co.cost=c.cost+d.cost;
co.time=c.time+d.time+5;
}
return;
}
Cost c;
Cost d;
c.bus=m_num;
c.station=m_station[m_station[0]];
c.time=abs(m_station[0]-p1)*3;
d.bus=m_num;
d.station=m_station[p2];
d.time=abs(p2-m_station[0]-1)*3;
if(m_cost)
...{
d.cost=1;
c.cost=1;
}
else
...{
d.cost=(d.time/3-1)/20+1;
c.cost=(c.time/3-1)/20+1;
d.cost=d.cost>3?3:d.cost;
c.cost=c.cost>3?3:d.cost;
}
if(c.time+d.time+5<ti.time||(c.time+d.time+5==ti.time&&c.cost+d.cost<ti.cost))
...{
Rt.clear();
Rt.push_back(c);
Rt.push_back(d);
ti.time=c.time+d.time+5;
ti.cost=c.cost+d.cost;
}
if(c.cost+d.cost<co.cost||(c.cost+d.cost==co.cost)&&c.time+d.time+5<co.time)
...{
Rc.clear();
Rc.push_back(c);
Rc.push_back(d);
co.cost=c.cost+d.cost;
co.time=c.time+d.time+5;
}
return;
}
break;
case 1:
Cost c;
c.bus=m_num;
c.station=m_station[p2];
c.time=abs(p2-p1)*3;
if(m_cost)
c.cost=1;
else
...{
c.cost=(abs(p2-p1)-1)/20+1;
c.cost=c.cost>3?3:c.cost;
}
if(c.cost<co.cost||(c.cost==co.cost && (Rc.size()>1 || c.time<co.time)))
...{
Rc.clear();
Rc.push_back(c);
co.cost=c.cost;
co.time=c.time;
}
if(c.time<ti.time||(c.time==ti.time && (Rt.size()>1 || c.cost<ti.cost)))
...{
Rt.clear();
Rt.push_back(c);
ti.time=c.time;
ti.cost=c.cost;
return;
}
break;
case 2:
int temp=abs(p1-p2);
c.bus=m_num;
c.station=m_station[p2];
c.time=temp*3;
if(m_station[p1]==m_station[1])
...{
c.time=(p2-1<m_station[0]-p2?(p2-1)*3:abs(m_station[0]-p2)*3);
}
if(m_station[p2]==m_station[1])
...{
c.time=(p1-1<m_station[0]-p1?(p1-1)*3:abs(m_station[0]-p1)*3);
}
if(m_cost)
c.cost=1;
else
...{
c.cost=(c.time/3-1)/20+1;
c.cost=c.cost>3?3:c.cost;
}
if(c.cost<co.cost||(c.cost==co.cost && (Rc.size()>1 || c.time<co.time)))
...{
Rc.clear();
Rc.push_back(c);
co.cost=c.cost;
co.time=c.time;
}
if(c.time<ti.time||(c.time==ti.time && (Rt.size()>1 || c.cost<ti.cost)))
...{
Rt.clear();
Rt.push_back(c);
ti.time=c.time;
ti.cost=c.cost;
}
if(p1==1||p2==1)
return;
int min=p2;
Cost d;
if(p1<p2)
...{
p2=p1;
p1=min;
c.time=(p2-1)*3;
d.time=abs(m_station[0]-p1)*3;
}
else
...{
c.time=abs(m_station[0]-p1)*3;
d.time=(p2-1)*3;
}
c.station=m_station[1];
d.bus=c.bus;
d.station=m_station[min];
if(m_cost)
...{
c.cost=d.cost=1;
}
else
...{
d.cost=(d.time/3-1)/20+1;
c.cost=(c.time/3-1)/20+1;
d.cost=d.cost>3?3:d.cost;
c.cost=c.cost>3?3:d.cost;
}
if(c.time+d.time+5<ti.time||(c.time+d.time+5==ti.time&&c.cost+d.cost<ti.cost))
...{
Rt.clear();
Rt.push_back(c);
Rt.push_back(d);
ti.time=c.time+d.time+5;
ti.cost=c.cost+d.cost;
}
if(c.cost+d.cost<co.cost||(c.cost+d.cost==co.cost)&&c.time+d.time+5<co.time)
...{
Rc.clear();
Rc.push_back(c);
Rc.push_back(d);
co.cost=c.cost+d.cost;
co.time=c.time+d.time+5;
}
return;
break;
}
}
void Result::getResult(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,
SmallCost &ti,SmallCost &co)
...{
vector<int> line1,line2;
int flag=0,temp1=0,temp2=0;
ti.cost=ti.time=co.cost=co.time=999999999;
if(Station[p1]&&Station[p2])
subway(p1,p2,Rt,Rc,ti,co);
for(int i=0;i<520;i++)
...{
temp1=m_bus[i].isexist( p1 );
if(temp1)
...{
line1.push_back(i);
flag=1;
}
temp2=m_bus[i].isexist(p2);
if(temp2)
...{
line2.push_back(i);
if(flag==1)
m_bus[i].Result(temp1,temp2,Rt,Rc,ti,co);
}
flag=0;
}
if(Station[p1])
line1.push_back(1000);
if(Station[p2])
line2.push_back(1000);
getResult1(p1,p2,line1,line2,Rt,Rc,ti,co);
getResult2(p1,p2,line1,line2,Rt,Rc,ti,co);
}
void Result::getResult1(int p1,int p2,vector<int> line1,vector<int> line2,
vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co)
...{
int i=0,j=0;
for(i=0;i<line1.size();i++)
for(j=0;j<line2.size();j++)
...{
if(line1.at(i)==line2.at(j))
continue;
vector<int> cross;
if(line1.at(i)<520&&line2.at(j)<520)
cross=hash_cross( m_bus[line1.at(i)], m_bus[line2.at(j)] );
else
...{
if(line1.at(i)>520)
cross=hash_cross(m_bus[line2.at(j)]);
else
cross=hash_cross(m_bus[line1.at(i)]);
}
if(cross.size()==0)
continue;
for(int k=0;k<cross.size();k++)
...{
int cro=cross.at(k);
int change_cost;
change_cost=5;
SmallCost t1=...{999999999,999999999};
SmallCost t2,c1,c2;
t2=c1=c2=t1;
vector<Cost> Rc1,Rc2,Rt1,Rt2;
int num1=line1.at(i),num2=line2.at(j);
if(num1==num2||p2==cro||p1==cro)
continue;
if(num1<520&&num2<520)
...{
m_bus[num1].Result(m_bus[num1].isexist(p1),m_bus[num1].isexist(cro),
Rt1,Rc1,t1,c1);
m_bus[num2].Result(m_bus[num2].isexist(cro),m_bus[num2].isexist(p2),
Rt2,Rc2,t2,c2);
change_cost=5;
}
if(num1==1000)
...{
change_cost=7;
subway(p1,cro,Rt1,Rc1,t1,c1);
m_bus[num2].Result(m_bus[num2].isexist(cro),m_bus[num2].isexist(p2),
Rt2,Rc2,t2,c2);
if(Rt1.at(0).bus<0)
change_cost=3;
}
if(num2==1000)
...{
m_bus[num1].Result(m_bus[num1].isexist(p1),m_bus[num1].isexist(cro),
Rt1,Rc1,t1,c1);
subway(cro,p2,Rt2,Rc2,t2,c2);
change_cost=6;
if(Rt2.at(0).bus<0)
change_cost=0;
}
if(t1.time==12)
...{
t1.time=12;
}
if(t1.time+t2.time+change_cost<ti.time||((t1.time+t2.time+change_cost==ti.time)&&t1.cost+t2.cost<ti.cost))
...{
int n=0;
Rt.clear();
for(n=0;n<Rt1.size();n++)
Rt.push_back(Rt1.at(n));
for(n=0;n<Rt2.size();n++)
Rt.push_back(Rt2.at(n));
ti.cost=t1.cost+t2.cost;
ti.time=t1.time+t2.time+change_cost;
}
if(c1.cost+c2.cost<co.cost||((c1.cost+c2.cost==co.cost)&&c1.time+c2.time+change_cost<co.time))
...{
int n=0;
Rc.clear();
for(n=0;n<Rc1.size();n++)
Rc.push_back(Rc1.at(n));
for(n=0;n<Rc2.size();n++)
Rc.push_back(Rc2.at(n));
co.cost=c1.cost+c2.cost;
co.time=c1.time+c2.time+change_cost;
}
Rc1.clear();
Rc2.clear();
Rt1.clear();
Rt2.clear();
t1.cost=t2.cost=c1.cost=c2.cost=999999999;
t1.time=t2.time=c1.time=c2.time=999999999;
}
}
}
void Result::getResult2(int p1,int p2,vector<int> line1,vector<int> line2,
vector<Cost> &Rt,vector<Cost> &Rc,SmallCost &ti,SmallCost &co)
...{
int i=0,j=0;
for(i=0;i<line1.size();i++)
...{
vector<DotLine>Dot;
if(line1.at(i)==1000)
Dot=Bus_train;
else
Dot=getDotline(m_bus[line1.at(i)]);
for(j=0;j<Dot.size();j++)
...{
int change_cost1,change_cost2;
change_cost1=change_cost2=5;
int dot;
dot=Dot.at(j).station;
int num=line1.at(i);
if(p1==dot||p2==dot)
continue;
SmallCost t1=...{999999999,999999999};
SmallCost t2,c1,c2;
t2=c1=c2=t1;
vector<Cost> Rc1,Rc2,Rt1,Rt2;
if(num==1000)
...{
subway(p1,dot,Rt1,Rc1,t1,c1);
change_cost1=change_cost2=7;
}
else
m_bus[num].Result(m_bus[num].isexist(p1),
m_bus[num].isexist(dot),Rt1,Rc1,t1,c1);
getResult1(dot,p2,Dot.at(j).bus,line2,Rt2,Rc2,t2,c2);
if(Rt1.size()>0&&Rt1.at(0).bus<0)
change_cost1=3;
if(Rt2.size()>0&&Rt2.at(0).bus>=1000)
change_cost1=6;
if(Rc1.size()>0&&Rc1.at(0).bus<0)
change_cost2=3;
if(Rc2.size()>0&&Rc2.at(0).bus>=1000)
change_cost2=6;
if((t1.time+t2.time+change_cost1<ti.time||((t1.time+t2.time+change_cost1==ti.time)&&t1.cost+t2.cost<ti.cost))&&t2.cost<99999999)
...{
int n=0;
Rt.clear();
for(n=0;n<Rt1.size();n++)
Rt.push_back(Rt1.at(n));
for(n=0;n<Rt2.size();n++)
Rt.push_back(Rt2.at(n));
ti.cost=t1.cost+t2.cost;
ti.time=t1.time+t2.time+change_cost1;
}
if((c1.cost+c2.cost<co.cost||((c1.cost+c2.cost==co.cost)&&c1.time+c2.time+change_cost2<co.time))&&c2.cost<99999999)
...{
int n=0;
Rc.clear();
for(n=0;n<Rc1.size();n++)
Rc.push_back(Rc1.at(n));
for(n=0;n<Rc2.size();n++)
Rc.push_back(Rc2.at(n));
co.cost=c1.cost+c2.cost;
co.time=c1.time+c2.time+change_cost2;
}
Rc1.clear();
Rc2.clear();
Rt1.clear();
Rt2.clear();
t1.cost=t2.cost=c1.cost=c2.cost=999999999;
t1.time=t2.time=c1.time=c2.time=999999999;
}
}
}
vector<DotLine> Result::getDotline(const Bus &b)
...{
vector<DotLine>Dot;
int i=1;
for(i=1;i<=b.m_station[0];i++)
...{
DotLine dl;
dl.station=b.m_station[i];
for(int j=0;j<520;j++)
...{
if( m_bus[j].isexist(b.m_station[i]) )
dl.bus.push_back(j);
}
Dot.push_back(dl);
}
if(b.m_flag==0)
...{
for(i=b.m_station[0]+1;i<b.m_station[0]+b.m_station[b.m_station[0]+1]+2;i++)
...{
DotLine dl;
dl.station=b.m_station[i];
for(int j=0;j<520;j++)
...{
if( m_bus[i].isexist(b.m_station[i]) )
dl.bus.push_back(i);
}
Dot.push_back(dl);
}
}
return Dot;
}
SmallCost get_SmallCost(vector<Cost> &V)
...{
SmallCost cost;
if(V.size()!=0)
...{
cost.cost=V.at(0).cost;
cost.time=V.at(0).time;
}
for(int i=1;i<V.size();i++)
...{
cost.time=cost.time+V.at(i).time+5;
cost.cost=cost.cost+V.at(i).cost;
}
return cost;
}
vector<int> hash_cross(const Bus &b)
...{
vector<int> cross;
int i=1;
for(i=1;i<=b.m_station[0];i++)
...{
if(Station[b.m_station[i]])
cross.push_back(b.m_station[i]);
}
if(b.m_flag==0)
...{
for(i=b.m_station[0]+2;i<b.m_station[0]+b.m_station[b.m_station[0]+1]+2;i++)
if(Station[b.m_station[i]])
...{
for(int k=0;k<cross.size();k++)
...{
if(cross.at(k)==b.m_station[i])
break;
}
if(k==cross.size())
cross.push_back(b.m_station[i]);
}
}
return cross;
}
vector<int> hash_cross(const Bus &b1,const Bus &b2)
...{
vector<int> cross;
bool hash[3957]=...{0};
int i=0;
for(i=1;i<=b1.m_station[0];i++)
hash[b1.m_station[i]]=1;
if(b1.m_flag==0)
for(i=b1.m_station[0]+2;i<b1.m_station[0]+b1.m_station[b1.m_station[0]+1]+2;i++)
hash[b1.m_station[i]]=1;
for(i=1;i<=b2.m_station[0];i++)
...{
if(hash[b2.m_station[i]])
...{
for(int k=0;k<cross.size();k++)
...{
if(cross.at(k)==b2.m_station[i])
break;
}
if(k==cross.size())
cross.push_back(b2.m_station[i]);
}
}
if(b2.m_flag==0)
...{
for(i=b2.m_station[0]+2;i<b2.m_station[0]+b2.m_station[b2.m_station[0]+1]+2;i++)
...{
if(hash[b2.m_station[i]])
...{
int k=0;
for(k=0;k<cross.size();k++)
...{
if(cross.at(k)==b2.m_station[i])
break;
}
if(k==cross.size())
cross.push_back(b2.m_station[i]);
}
}
}
return cross;
}
istream &operator>>(istream &fcin,Bus &bus)
...{
fcin>>bus.m_num;
fcin>>bus.m_cost;
fcin>>bus.m_flag;
if(bus.m_flag==0)
bus.rdouble(fcin);
else
bus.rsingle(fcin);
return fcin;
}
ostream &operator<<(ostream &fcout,Cost &cost)
...{
fcout<<cost.bus<<" "<<cost.station<<" "<<cost.cost<<" "<<cost.time<<endl;
return fcout;
}
Result::Result()
...{
ifstream file("L.txt");
if(!file)
...{
cout<<"文件打开失败"<<endl;
return;
}
for(int i=0;i<520;i++)
file>>m_bus[i];
file.close();
file.open("D.txt");
if(!file)
...{
cout<<"文件打开失败"<<endl;
return;
}
int num=0,data=0;
file>>num;
while(file>>data)
...{
if(data==0)
...{
file>>num;
continue;
}
Station[data]=num;
}
}
int Result::getmaxs()
...{
int max=0;
for(int i=0;i<520;i++)
...{
int n=0;
if(m_bus[i].m_flag==0)
n=m_bus[i].m_station[0]+m_bus[i].m_station[m_bus[i].m_station[0]+1]+1;
else
n=m_bus[i].m_station[0];
for(int j=0;j<n;j++)
if(max<m_bus[i].m_station[j])
max=m_bus[i].m_station[j];
}
return max;
}
void Result::subway(int p1,int p2,vector<Cost> &Rt,vector<Cost> &Rc,
SmallCost &ti,SmallCost &co)
...{
Rt.clear();
Rc.clear();
Cost cost;
int save=p2;
if(Station[p1]==0&&Station[p2]==0)
return;
p1=Station[p1];
p2=Station[p2];
if(p1==p2)
...{
cost.bus=-p1;
cost.cost=0;
cost.time=8;
cost.station=save;
Rt.push_back(cost);
Rc.push_back(cost);
ti.cost=co.cost=0;
ti.time=co.time=8;
return;
}
if( (p1<24&&p2<24) || (p1>23&&p2>23) ||p1==12
|| p2==12 || p1==18 || p2==18)
...{
if(p1<24&&p2<24)
...{
cost.bus=1000;
cost.cost=3;
cost.station=p2;
cost.time=abs(p2-p1)*2.5;
Rt.push_back(cost);
Rc.push_back(cost);
ti.cost=co.cost=3;
ti.time=co.time=cost.time;
return;
}
cost.station=p2;
p1=(p1>26?p1+1:p1);
p1=(p1>33?p1+1:p1);
p2=(p2>26?p2+1:p2);
p2=(p2>33?p2+1:p2);
p1=(p1==12?27:p1);
p2=(p2==12?27:p2);
p1=(p1==18?34:p1);
p2=(p2==18?34:p2);
cost.bus=1001;
int tt=abs(p1-p2);
tt=(tt>9?tt=18-tt:tt);
cost.time=tt*2.5;
cost.cost=3;
Rt.push_back(cost);
Rc.push_back(cost);
co.cost=ti.cost=3;
co.time=ti.time=cost.time;
return;
}
else
...{
int temp1=p1,temp2=p2;
int core=0;
temp1=p1>p2?temp1:p2;
temp2=p1>p2?temp2:p1;
if(temp1<27||temp2<12)
core=12;
if(temp1>32||temp2>18)
core=18;
if(core==0)
...{
temp1=33-temp1+18;
if(temp1-temp2>=7)
core=12;
else
core=18;
}
Cost cost2;
if(p1>p2)
...{
cost.bus=1001;
cost2.bus=1000;
if(core==18)
if(p1>32)
cost.time=abs(p1-32)*2.5;
else
cost.time=abs(p1-33)*2.5;
else
if(p1>26)
cost.time=abs(p1-26)*2.5;
else
cost.time=abs(p1-27)*2.5;
cost2.time=abs(p2-core)*2.5;
}
else
...{
cost.time=abs(core-p1)*2.5;
cost.bus=1000;
cost2.bus=1001;
if(core==18)
cost2.time=(abs(p2-32.5)+0.5)*2.5;
else
cost2.time=(abs(p2-26.5)+0.5)*2.5;
}
cost.cost=3;
cost.station=core;
cost2.cost=0;
cost2.station=p2;
Rt.push_back(cost);
Rc.push_back(cost2);
ti.cost=co.cost=3;
ti.time=co.time=cost.time+cost2.time+4;
}
}
//Mbus.cpp
#include"Cbus.h"
#include<iostream>
using namespace std;
int Station[3958]=...{0};
vector<DotLine> Bus_train;
int main()
...{
vector<Cost> Rt,Rc,Rd;
Result R;
for(int i=1;i<3958;i++)
if(Station[i])
...{
DotLine dl;
dl.station=i;
for(int j=0;j<520;j++)
...{
if( R.m_bus[j].isexist(i))
dl.bus.push_back(j);
}
Bus_train.push_back(dl);
}
SmallCost time,cost,disp;
int p1,p2;
while(1)
...{
cout<<"请输入两个公交站点"<<endl;
cin>>p1;
if(p1==0)
break;
cin>>p2;
if(p1==p2)
...{
cout<<"输入有误,相同的两个站点"<<endl;
continue;
}
R.getResult(p1,p2,Rt,Rc,time,cost);
cout<<"时间最短路线"<<endl;
cout<<"车次 中转站 花费 时间(分)"<<endl;
for(int i=0;i<Rt.size();i++)
...{
cout<<Rt.at(i)<<endl;
}
if(Rt.size()==0)
cout<<"没有找到时间最短线路"<<endl;
else
cout<<"总时间:"<<time.time<<" 总费用:"<<time.cost<<endl;
cout<<"费用最少路线"<<endl;
cout<<"车次 下站 花费 时间(分)"<<endl;
for(i=0;i<Rc.size();i++)
...{
cout<<Rc.at(i)<<endl;
}
if(Rc.size()==0)
cout<<"没有找到费用最少线路"<<endl;
else
cout<<"总时间:"<<cost.time<<" 总费用:"<<cost.cost<<endl;
Rc.clear();
Rt.clear();
}
return 0;
}
相关文章推荐
- 数学建模中十大算法实现步骤与代码
- 【转】MATLAB实现构造Euler环游图的算法——数学建模
- MATLAB实现构造Euler环游图的算法——数学建模
- 数学建模竞赛中应当掌握的十类算法
- JAVA实现的AZDG加密-解密算法(附源程序)(lp)
- 算法.数学.初级.求最小公倍数--(利用最大公约数的辗转相除法),powerbuilder powerscript实现
- 数学建模十大经典算法漫谈
- BP神经网络的数学原理及其算法实现
- 用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C
- 趣味数学问题的算法实现
- 数学建模程序与算法之整数线性规划
- 【数学建模集训系列】公交查询系统的matlab实现-问题重述
- 【数学建模集训系列】公交查询系统的matlab实现-只含公交的查询
- 【转】 数学建模十大经典算法漫谈
- 数学建模十大算法---来自百度
- BP神经网络的数学原理及其算法实现
- 数学建模--常用算法及程序
- 留学生作业代写 编程代写 有偿代写 python matlab数学建模 机器学习 深度学习 c# c++ 数学 算法 论文程序代写
- BP神经网络的数学原理及其算法实现
- 偏最小二乘回归分析建模步骤的R实现(康复俱乐部20名成员测试数据)+补充pls回归系数矩阵的算法实现