PAT (Advanced Level) Practice - 1018 Public Bike Management(30 分)

简介: PAT (Advanced Level) Practice - 1018 Public Bike Management(30 分)

题目链接:点击打开链接

题目大意:每个自行车车站的最大容量为一个偶数cmax,如果一个车站里面自行车的数量恰好为cmax / 2,那么称处于完美状态。如果一个车站容量是满的或者空的,控制中心(处于结点0处)就会携带或者从路上收集一定数量的自行车前往该车站,一路上会让所有的车站沿途都达到完美。现在给出cmax,车站的数量n,问题车站sp,m条边,还有距离,求最短路径。如果最短路径有多个,求能带的最少的自行车数目的那条。如果还是有很多条不同的路,那么就找一个从车站带回的自行车数目最少的。带回的时候是不调整的。

解题思路:Dijkstra + DFS。如果只有Dijkstra是不可以的,因为minNeed和minBack在路径上的传递不满足最优子结构,不是简单的相加的过程,只有在所有路径都确定了之后才能区选择最小的need和最小的back。

Dijkstra求最短路径,dfs求minNeed和minBack和最终path,dfs的时候模拟一遍需要调整的过程,求出最后得到的need和back,与minNeed和minBack比较然后根据情况更新path,最后输出 minNeed path 和 minBack,记得path是从最后一个结点一直到第一个结点的,所以要倒着输出。


AC 代码

#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#define MOD 1000000007usingnamespacestd;
typedeflonglongll;
constintmaxn=520;
intn,mined,mibak;
intwrr[maxn], vis[maxn], dis[maxn];
intg[maxn][maxn];
vector<int>pre[maxn], tpath, path;
voidinit()
{
mined=mibak=INF;
mem(dis,INF); mem(g,INF);
mem(vis,0); mem(wrr,0);
}
intdijkstra(ints)
{
dis[s]=0;
while(1)
    {
intmi=INF; s=-1;
for(inti=0;i<=n;i++)
if(!vis[i] &&dis[i]<mi) mi=dis[i], s=i;
if(s==-1) return0;
vis[s]=1;
for(inti=0;i<=n;i++)
        {
if(!vis[i] &&mi+g[s][i]<dis[i])
            {
dis[i]=mi+g[s][i];
pre[i].clear();
pre[i].push_back(s);
            }
elseif(!vis[i] &&dis[i]==mi+g[s][i])
pre[i].push_back(s);
        }
    }
}
voiddfs(ints)
{
tpath.push_back(s);
if(0==s)
    {
intned=0, bak=0;
for(inti=tpath.size()-1;i>=0;i--)
        {
intu=tpath[i], w=wrr[u];
if(w>0)
bak+=w;
else            {
if(bak>-w)
bak+=w;
else                {
ned+=-w-bak;
bak=0;
                }
            }
        }
if(ned<mined)
        {
mined=ned;
mibak=bak;
path=tpath;
        }
elseif(ned==mined&&bak<mibak)
        {
mibak=bak;
path=tpath;
        }
tpath.pop_back();
return;
    }
for(inti=0;i<pre[s].size();i++)
dfs(pre[s][i]);
tpath.pop_back();
}
intmain()
{
init();
intcmax,m,w,u,v,sp;
scanf("%d%d%d%d",&cmax,&n,&sp,&m);
for(inti=1;i<=n;i++) scanf("%d",&wrr[i]), wrr[i]=wrr[i]-cmax/2;
for(inti=0;i<m;i++) scanf("%d%d%d",&u,&v,&w), g[u][v]=g[v][u]=w;
dijkstra(0);
dfs(sp);
printf("%d ",mined);
for(inti=path.size()-1;i>=0;i--) printf("%d%s",path[i],i==0?"":"->");
printf(" %d\n",mibak);
return0;
}
目录
相关文章
|
10月前
|
运维 负载均衡 安全
|
11月前
|
JavaScript
js---三元表达式详解
js---三元表达式详解
382 0
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。
|
存储 Linux 网络安全
Linux版百度网盘丨直接在服务器SSH命令行中使用百度云,轻松解决数据传输和分享难题
Linux版百度网盘丨直接在服务器SSH命令行中使用百度云,轻松解决数据传输和分享难题
|
开发工具 git 开发者
使用Git进行版本控制的最佳实践
【6月更文挑战第3天】使用Git进行版本控制的最佳实践包括:初始化配置Git仓库,设置个人信息和默认编辑器;提交信息要简洁明了,使用有意义的标题和描述;分支管理中,为新功能或修复创建分支,定期合并并保持主分支稳定;进行代码审查以保证质量;使用标签标记里程碑;忽略不必要的文件;定期备份仓库并学会恢复操作;不断学习和实践Git的高级用法。遵循这些实践可提升开发效率和代码质量。
|
存储 网络协议 网络架构
网络中的大包和小包相关问题总结
网络中的大包和小包相关问题总结
1674 0
|
Java 测试技术
SpringBoot 项目启动内存占用过高优化以及内存查看
SpringBoot 项目启动内存占用过高优化以及内存查看
1228 0
|
存储 Ubuntu Linux
Linux下7款最佳的开源视频播放器
Linux下7款最佳的开源视频播放器
2086 0
|
存储 Linux 编译器
Linux平台上DPDK入门指南:快速提升网络性能的利器
Linux平台上DPDK入门指南:快速提升网络性能的利器
|
Ubuntu Unix Linux
双系统下ubuntu自动挂载windows盘
双系统下ubuntu自动挂载windows盘
1665 0
双系统下ubuntu自动挂载windows盘