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;
}
目录
相关文章
|
4月前
|
监控 NoSQL 数据可视化
Django+Celery 进阶:Flower可视化监控与排错
本文介绍了Celery命令行工具与图形监控工具的使用,涵盖查看Worker状态、任务信息及集成至Django项目的方法,同时提供Redis监控与常见问题排错方案。
405 1
|
人工智能 搜索推荐
数字孪生与体育:运动员表现分析
数字孪生技术在体育领域的应用正逐步改变运动员的训练和表现分析方式。通过创建虚拟模型,该技术能够实现个性化训练计划制定、比赛环境模拟、潜在伤害风险预测、技术动作精细化分析及团队战术布局模拟。结合AI技术,数字孪生为教练和运动员提供实时反馈和数据驱动的决策支持,助力提升竞技水平。
|
4月前
|
存储 缓存 Apache
Apache Iceberg数据湖高级特性及性能调优
性能调优涵盖索引优化、排序策略与元数据管理。通过布隆过滤器、位图索引等提升查询效率,结合文件内/间排序优化I/O与压缩,辅以Z-Order实现多维数据聚集。同时,合理配置元数据缓存与清单合并,加速查询规划。适用于点查、全表扫描及高并发写入场景,显著提升系统性能与资源利用率。
|
运维 负载均衡 安全
|
存储 网络协议 网络架构
网络中的大包和小包相关问题总结
网络中的大包和小包相关问题总结
1903 0
|
存储 Linux 编译器
Linux平台上DPDK入门指南:快速提升网络性能的利器
Linux平台上DPDK入门指南:快速提升网络性能的利器
|
存储 Ubuntu Linux
Linux下7款最佳的开源视频播放器
Linux下7款最佳的开源视频播放器
2702 0
|
数据挖掘
评测哪家静态IP代理更适合购买?
在当今的网络时代,静态IP代理已经成为了许多企业和个人用户进行网络爬取、数据挖掘、反欺诈等操作的必备工具。
评测哪家静态IP代理更适合购买?
|
算法 索引 Python
宏基因组之基因组装
宏基因组组装,即把短的reads拼装成连续的序列contig,再根据PE等关系将contig拼装成scaffold。与单个基因组组装不同,宏基因组组装最终得到的是环境样品中全部微生物的混合scaffold。理想情况下一条scaffold对应一个物种的全基因组。但由于序列太短或者覆盖度不够,很难拼出一条完整的基因组。针对高通量测序数据,出现了多种拼接算法和软件。
910 0
|
Ubuntu Unix Linux
双系统下ubuntu自动挂载windows盘
双系统下ubuntu自动挂载windows盘
1824 0
双系统下ubuntu自动挂载windows盘