热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

洛谷题解P1772【[ZJOI2006]物流运输】

题目描述物流公司要把一批货物从码头\(A\)运到码头\(B\)。由于货物量比较大,需要\(n\)天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条

题目描述

物流公司要把一批货物从码头\(A\)运到码头\(B\)。由于货物量比较大,需要\(n\)天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是—件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个\(n\)天的运输计划,使得总成本尽可能地小。

输入输出格式

输入格式:

第一行是四个整数\(n(l≤n≤100),m(l≤m≤20)\),\(k\)\(e\)\(n\)表示货物运输所需天数,\(m\)表示码头总数,\(k\)表示每次修改运输路线所需成本,\(e\)表示航线条数。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度\((>0)\)。其中码头\(A\)编号为\(1\),码头\(B\)编号为\(m\)。单位长度的运输费用为\(1\)。航线是双向的。再接下来一行是一个整数d,后面的d行每行是三个整数\(P(1,\(a\),\(b(1≤a≤b≤n)\)。表示编号为P的码头从第\(a\)天到第\(b\)天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一条从码头\(A\)到码头\(B\)的运输路线。

输出格式:

包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。

【题意】

平面上有\(m(m<&#61;20)\)个点&#xff0c;\(e\)条边&#xff0c;需要你求\(n(n<&#61;100)\)次从\(1\)号点到\(n\)号点的最短路&#xff0c;如果你改变了最短路径&#xff0c;那么需要另外花费\(k\)元。每一条路径可能会在某&#xff08;些&#xff09;个时间段内关闭&#xff0c;问这n次最短路的总花费最小需要几元

【算法】

\(DP&#43;\text{最短路}\)

【分析】

注&#xff1a;部分摘自here

最优解问题明显就是一个dp&#xff0c;而求两点之间的距离当然就是最短路了~

我们先考虑DP

  • 设计状态

我们设dp[i]为前i天所需花费的最小费用

  • 状态转移

f[i]&#61;min(f[i],f[j-1]&#43;(i-j&#43;1) * L&#43;K) &#xff08;1<&#61;j<&#61;i)

什么意思呢? 就是第j天到第i天走同一条路&#xff0c;并且这条路和第j-1天是不同的

  • 最短路

那么第j天到第i天走的肯定是此时情况下的最短路了,所以L表示在当前情况下的\(1->m\)的最短路,可以用\(Spfa\)\(Dijktra\)求解

  • 考虑码头是否开启

那么现在就要考虑码头无法使用的情况了&#xff0c;因为我们要保证第j天到第i天走的最短路是不能包括在这些天内不能经过的点的(哪怕是1天或是间断的几天都不行)

所以我们枚举j的时候可以从大到小枚举&#xff0c;并且将第j天无法通过的点同j&#43;1->i天无法通过的点塞入一个集合(数组)&#xff0c;并且在求最短路时判断不经过集合(数组)中的点&#xff0c;就可以求出从第j天到第i天经过未损坏的点从1到m的最短路了。

【代码】

#include
using namespace std;
int n,m,k,e;
int q;
vectorver[25];
vectoredge[25];
bool tf[105][25];
int dp[105];
int d[105];
bool flag[105];
inline int read()
{int tot&#61;0;char c&#61;getchar();while(c<&#39;0&#39;||c>&#39;9&#39;)c&#61;getchar();while(c>&#61;&#39;0&#39;&&c<&#61;&#39;9&#39;){tot&#61;tot*10&#43;c-&#39;0&#39;;c&#61;getchar();}return tot;
}
inline void SPFA()
{memset(d,0x3f,sizeof(d));queueq;q.push(1);d[1]&#61;0;while(q.size()){int now&#61;q.front();q.pop();for(int i&#61;0;i}
int main()
{n&#61;read();m&#61;read();k&#61;read();e&#61;read();for(int i&#61;1;i<&#61;e;i&#43;&#43;){int x&#61;read(),y&#61;read(),z&#61;read();ver[x].push_back(y);edge[x].push_back(z);ver[y].push_back(x);edge[y].push_back(z);}q&#61;read();for(int i&#61;1;i<&#61;q;i&#43;&#43;){int p&#61;read(),a&#61;read(),b&#61;read();for(int j&#61;a;j<&#61;b;j&#43;&#43;)tf[j][p]&#61;1;}memset(dp,0x3f,sizeof(dp));dp[0]&#61;0;for(int i&#61;1;i<&#61;n;i&#43;&#43;){for(int j&#61;1;j<&#61;m;j&#43;&#43;)flag[j]&#61;0;//for(int j&#61;1;j<&#61;n;j&#43;&#43;)if(tf[i][j])flag[j]&#61;1;for(int j&#61;i;j>&#61;1;j--){for(int kk&#61;1;kk<&#61;m;kk&#43;&#43;)if(tf[j][kk])flag[kk]&#61;1;/*cout<}

转:https://www.cnblogs.com/hulean/p/11133128.html



推荐阅读
  • 题目编号:2049 [SDOI2008]Cave Exploration。题目描述了一种动态图操作场景,涉及三种基本操作:断开两个节点间的连接(destroy(a,b))、建立两个节点间的连接(connect(a,b))以及查询两节点是否连通(query(a,b))。所有操作均确保图中无环存在。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本题要求计算一组正整数的最小公倍数(LCM)。输入包括多组测试数据,每组数据首先给出一个正整数n,随后是n个正整数。 ... [详细]
  • 题目描述:计算从起点到终点的最小能量消耗。如果下一个单元格的风向与当前单元格相同,则消耗为0,否则为1。共有8个可能的方向。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • 本文详细介绍了如何在Windows操作系统中配置和使用Lex(Flex)与Yacc(Bison),包括软件的下载、安装以及通过示例验证其正确性的步骤。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • mysql数据库json类型数据,sql server json数据类型
    mysql数据库json类型数据,sql server json数据类型 ... [详细]
author-avatar
a105451223
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有