题目要求
翻译
杭州市的自行车站管理系统,每个站点都有一定数量的自行车,数量处于最大值一半的状态是“perfect condition”(有车可借,有空位可还车),如果数量是0,称之为“problem condition”,需要从调度中心去运送车辆。运送路程中,如果经过自行车站点,会顺带调整该站点的状态,多的车子带走,少的顺带补齐。已知各个自行车站点的通车时间,求问最短的行车路线,如果存在多个最短路线,那么需要补送自行车最少的一个是多少。
代码
#include<iostream>
#include<vector>
using namespace std;
int cap,n,p,m;
int bike[501],dis[501][501],mindis[501];
vector<int> v[501];
vector<int>path;
int final_dis=99999,final_send,final_take;
vector<int> ans;
void dfs(int cur,int curdis,int cursend,int curtake)
{
if(curdis>mindis[cur]) return;//及时止损
path.emplace_back(cur);//将当前站点加入路径
if(cur==p)//如果到达目标站点
{
if(curdis<final_dis||(curdis==final_dis&&cursend<final_send)||(curdis==final_dis&&cursend==final_send&&curtake<final_take))//寻找最优路线
{
ans=path;
final_dis=curdis;
final_send=cursend;
final_take=curtake;
}
}else
{
if(mindis[cur]>curdis) mindis[cur]=curdis;//更新最短路径长度
for(int i:v[cur])//遍历迭代
{
if(curtake+bike[i]<cap/2)//如果进入下一个站点的车少于下一站半容量,需要多send差值的车,不用再往外take
{
dfs(i,curdis+dis[cur][i],cursend+cap/2-curtake-bike[i],0);
}else//如果不少于,则需要take多余的车
{
dfs(i,curdis+dis[cur][i],cursend,curtake+bike[i]-cap/2);
}
}
}
path.pop_back();
}
int main()
{
int i,j,k;
cin>>cap>>n>>p>>m;
for(int i=1;i<=n;i++) cin>>bike[i];
while(m--)
{
cin>>i>>j>>k;
v[i].emplace_back(j);
v[j].emplace_back(i);
dis[i][j]=dis[j][i]=k;
}
for(i=0;i<=n;i++) mindis[i]=999999;
dfs(0,0,0,0);
cout<<final_send<<" ";
for(i=0;i<ans.size();i++)
{
if(i==0) cout<<ans[i];
else
{
cout<<"->"<<ans[i];
}
}
cout<<" "<<final_take;
system("pause");
}
思路
经典的深度优先遍历解题。
思路在代码的注释中。