⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.cpp

📁 07年数学建模b题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                    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; 
         &nbs, p;  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; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -