📄 1.cpp
字号:
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 + -