浙江师范大学论坛's Archiver

异度空间 发表于 2007-11-6 08:15

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

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

网站web安全
检测认证
公共信息网络
安全备案
电子公告服务
备案网站
信息网络安全
报警服务
网络不良信息
举报中心

Powered by zjnubbs 6.1.0  © 2007-2009 蚂蚁策划