2007数学建模B题算法与实现源程序

本文介绍了求解从起点到终点最大换乘次数为最优线路的算法,包括多个递归步骤,利用哈希表和空间换时间的优化策略。算法涉及了起点到终点的局部最优解、线路上站点的遍历以及站点间的最优路径连接。同时,提供了C++实现的源代码,包括类定义和函数实现,用于处理公交线路的搜索和优化问题。
摘要由CSDN通过智能技术生成
求解从起点到终点最大换乘次数为的最优线路的基本步骤如下:
步骤(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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值