求解从起点到终点最大换乘次数为的最优线路的基本步骤如下:
步骤(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
#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