P1772 [ZJOI2006] 物流运输

news2024/11/26 14:57:21

题目提供者  洛谷

难度  提高+/省选-

题目描述

物流公司要把一批货物从码头 A 运到码头 B。由于货物量比较大,需要 n 天才能运完。货物运输过程中一般要转停好几个码头。

物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。

但是修改路线是—件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个 n 天的运输计划,使得总成本尽可能地小。

输入格式

第一行是四个整数 n,m,k,e。n 表示货物运输所需天数,m 表示码头总数,k表示每次修改运输路线所需成本,e 表示航线条数。

接下来 e 行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度。其中码头 A 编号为 1,码头 B 编号为 m。单位长度的运输费用为 1。航线是双向的。

再接下来一行是一个整数 d,后面的 d 行每行是三个整数 p,a,b。表示编号为 p的码头在 [a,b] 天之内无法装卸货物。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一条从码头 A 到码头 B 的运输路线。

输出格式

包括了一个整数表示最小的总成本。
总成本为 nn 天运输路线长度之和 +k × 改变运输路线的次数。

输入输出样例

输入 #1

  5 5 10 8
  1 2 1
  1 3 3
  1 4 2
  2 3 2
  2 4 4
  3 4 1
  3 5 2
  4 5 2
  4
  2 2 3
  3 1 1
  3 3 3
  4 4 5

输出 #1

32

说明/提示

【数据范围】 对于 100% 的数据,1 ≤ n ≤ 100,1 ≤ m ≤ 20,1 ≤ k ≤  500,1 ≤ e ≤ 200。

【样例输入说明】

上图依次表示第 11 至第 55 天的情况,阴影表示不可用的码头。

【样例输出说明】

前三天走 1→4→5,后两天走 1→3→5,这样总成本为 (2+2)×3+(3+2)×2+10=32。

_NOI导刊2010提高(01)

 题解:

#include<bits/stdc++.h>
#define soo (1e8)
#define ll long long
using namespace std;
int d,cnt,head[25],dis[25],vis[25],cant_vis[25];
ll co[105][105],dp[105];
int n,m,k,ee,cl[25][105];
struct Edge{
	int v,nx,s;
}e[10005];
inline int read(){
    int ret=0,ff=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') ff=-ff;ch=getchar();}
    while(isdigit(ch)){ret=(ret<<3)+(ret<<1)+ch-'0';ch=getchar();}
    return ret*ff;
}
void add(int x,int y,int z){
	e[++cnt].v=y;
	e[cnt].s=z;
	e[cnt].nx=head[x];
	head[x]=cnt;
}
void spfa(){//爱跑什么跑什么
	for(int i=1;i<=m;i++) dis[i]=soo,vis[i]=0;
	queue<int> q;
	dis[1]=0;
	q.push(1);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=head[x];i;i=e[i].nx){
			int v=e[i].v;
			if(cant_vis[v]) continue;
			if(dis[v]>dis[x]+e[i].s){
				dis[v]=dis[x]+e[i].s;
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
}
signed main(){
	n=read(),m=read(),k=read(),ee=read();
	for(int i=1;i<=ee;i++){
		int x=read(),y=read(),z=read();
		add(x,y,z);
		add(y,x,z);
	}
	d=read();
	for(int i=1;i<=d;i++){
		int t=read(),x=read(),y=read();
		for(int j=x;j<=y;j++) cl[t][j]=1;
	}
	//cl[i][j]表示第i个码头在第j天不能走
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			memset(cant_vis,0,sizeof(cant_vis));
			for(int r=i;r<=j;r++)
				for(int l=1;l<=m;l++)
					if(cl[l][r]) cant_vis[l]=1;
			spfa();
			co[i][j]=dis[m];
		}
	memset(dp,0x7f,sizeof(dp));
	for(int i=1;i<=n;i++){
		dp[i]=(ll)co[1][i]*i;
		for(int j=i-1;j>=0;j--)
			dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j)+k);
	}
	printf("%lld",dp[n]);
    return 0;
}

成功图片:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20230516使用python3确认三门问题

最烧脑的悖论&#xff0c;意识为什么会影响未来&#xff1f;颠覆你认知的三门问题播报文章 小红虾实验室 2023-04-09 06:08 四川 好看视频优创联盟,优质科学领域创作者 关注 对于懂概率的人来说&#xff0c;他中大奖的概率将成倍增加&#xff0c;甚至获奖率能够达到100%。 今…

【量化交易笔记】6.布林带的实现

上一讲介绍A股移动平均值&#xff08;MA&#xff09;指标&#xff0c;本讲我们来讲解布林布的实现。 布林线&#xff08;BOLL&#xff09;技术指标简介 布林线&#xff08;Bollinger Bands&#xff0c;BOLL&#xff09;又称布林带&#xff0c;是约翰布林&#xff08;John Bol…

dbForge Studio for SQL Server Crack

dbForge Studio for SQL Server Crack 增加了对源代码管理中的数据操作语言(DML)触发器排序的支持。 添加了对不使用EXEC/EXECUTE关键字调用过程/函数的语法支持。 在语法检查中添加了对EXEC命令的支持。 dbForge Studio for SQL Server是一个IDE&#xff0c;用于SQL Server中的…

抖音本地生活服务商贴牌小程序

作为社交电商平台的一部分&#xff0c;抖音本地生活服务的市场前景非常广阔。以下是抖音本地生活服务商市场前景的几个方面&#xff1a; 巨大的用户群体&#xff1a;抖音拥有数亿的用户&#xff0c;这些用户中有很多人需要本地生活服务&#xff0c;如美食、酒店、旅游等&am…

对话三维家创始人蔡志森:AIGC让家装从“填空题”变成了“选择题”

&#xff08;图片来源&#xff1a;Pixels&#xff09; 三维家讲透了一个道理&#xff1a;数字化企业如何利用已有优势构建AGI能力。 数科星球原创 作者丨苑晶 编辑丨大兔 AIGC火热半年有余&#xff0c;人们已对ChatGPT不再陌生。 从互联网巨头再到上一代AI企业&#xff0c;…

TiKV 新架构:Partitioned Raft KV 原理解析

作者&#xff1a;徐奇 TiKV 推出了名为“partitioned-raft-kv”的新实验性功能&#xff0c;该功能采用一种新的架构&#xff0c;不仅可以显著提高 TiDB 的可扩展性&#xff0c;还能提升 TiDB 的写吞吐量和性能稳定性。 在上一篇文章中&#xff0c;我们介绍了 Partitioned Raf…

就业内推 | 中国移动招网工,有云计算认证的看过来

01 中移集成 &#x1f537;招聘岗位&#xff1a;云网络工程师 &#x1f537;职责描述&#xff1a; 1、具有云网项目售前工作经验&#xff0c;精通云网络架构和技术原理&#xff1b;熟悉国内主流云厂商阿里云、腾讯云等整体架构和产品体系。 2、具备一定的云网项目交付能力&…

【追梦之旅】——栈居然还能这样玩?!+ 力扣 - 有效括号

【追梦之旅】——栈居然还能这样玩&#xff1f;&#xff01; 力扣 - 有效括号 ~&#x1f60e; 前言&#x1f64c;什么是栈&#xff1f;栈的C语言实现头文件编写源码&#xff1a;功能文件编写源码&#xff1a;测试文件编写源码&#xff1a; 力扣题解——有效的括号 总结撒花&…

从C出发 33 --- 自定义数据类型(中)

struct 结构体类型的本质是 数据类型 &#xff0c;既然是数据类型&#xff0c;就是用来创建变量&#xff0c;而创建的这个变量其实是 变量的集合&#xff0c;是结构体里面成员变量的集合 struct Test {int a,b;}; struct Test tt.a 1; t.b 2;//意味着&#xff0c;结构体变…

数据结构学习记录——图的遍历(深度优先搜索、广度优先搜索、为什么需要两种遍历、图不连通怎么办)

目录 深度优先搜索 概念 图解过程 伪代码 时间复杂度 具体代码&#xff08;C语言&#xff09; 广度优先搜索 概念 图解过程 伪代码 时间复杂度 具体代码&#xff08;C语言&#xff09; 为什么需要两种遍历 图不连通怎么办 连通 路径 回路 连通图 连通…

FreeRTOS(2)----任务管理

一&#xff0c;任务的基本概念 FreeRTOS是一个支持多任务的操作系统&#xff0c;多个任务可以共享一个优先级&#xff0c;当任务configUSE_TIME_SLICING 为 1&#xff0c;则可以使用时间调度的方式共享处理器。 简而言之&#xff0c;freertos任务就是一系列任务的集合。 二&…

day05_Java中的运算符

在Java中提供了丰富的运算符 其按照功能分&#xff1a;算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符按照操作数个数分&#xff1a;一元运算符&#xff08;单目运算符&#xff09;、二元运算符&#xff08;双目运算符&#xff09;、三元运算符 &#xff08;三目…

python 元类

目录 元类type介绍使用元类创建类直接使用type继承type 类和对象的创建过程元类有什么用使用元类实现一个单例模式 元类type介绍 我们知道在python中一切皆对象&#xff0c;即使是类&#xff0c;也是对象&#xff0c;那么类这个对象是的类是谁呢&#xff1f;那就是元类。 通过…

Autosar NM网络管理机制(三大三小模式切换、NM网络报文的帧格式解析、NM中用到的定时器配置)

网络管理机制 AUTOSAR网络管理机制其实十分简单&#xff0c;概括下来三句话&#xff1a; 需要通信就发网络报文&#xff0c;否则就停发网络报文&#xff0c;所有节点同睡同醒。 下图是网络管理的状态机&#xff1a; 网络管理包括三个模式&#xff1a;Network Mode、Prepare …

【指针初阶 2023516】

#include <stdio.h>int main() {int a 100;int * pa &a;//pa是专门用来存放地址&#xff08;指针&#xff09;的&#xff0c;这里的pa就被称为指针变量char* pc &a;//指针变量在32为平台下是4个字节//指针变量在64为平台下是8个字节//int arr[10];//printf(&q…

计算机图形学-GAMES101-3

一、transformation-变换 &#xff08;1&#xff09;Scale 缩放变换示意图 图形每个像素对应坐标的计算公式 写成缩放矩阵的形式 非均匀缩放 &#xff08;2&#xff09;Reflection Matrix 镜面变换示意图 图形每个像素对应坐标的计算公式 写成镜像矩阵的形式 …

阿里HR:年轻人你把握不住.....

前言 去阿里面试测试工程师&#xff0c;这里面水太深&#xff0c;什么未来规划&#xff0c;职业发展的东西都是虚拟的&#xff0c;作者还太年轻&#xff0c;没有那个经历&#xff0c;把握不住。项目只有几个&#xff0c;开心快乐就行&#xff0c;不PK&#xff0c;文明PK。 很…

文心一言 VS chatgpt (17)-- 算法导论4.1 3~4题

三、在你的计算机上实现最大子数组问题的暴力算法和递归算法。请指出多大的问题规模n0是性能交叉点一一从此之后递归算法将击败暴力算法?然后&#xff0c;修改递归算法的基本情况一一当问题规模小于 n0 时采用暴力算法。修改后&#xff0c;性能交叉点会改变吗? 文心一言&…

进程间通信(匿名管道、命名管道、共享内存)

目录 匿名管道 创建管道---pipe() 命名管道 创建FIFO FIFO 操作 用命名管道实现server&client通信 共享内存 1.创建共享内存函数shmget() 2.获得共享内存地址函数shmat() 3.删除共享内存函数shmdt() 4.共享内存控制函数shmctl() 在Linux下的多个进程间的通信机制…

Unittest单元测试框架之unittest的第三方库paramunittest参数化基础及应用

一、unittest参数化介绍 参数化测试用于当需要使用多组不同的测试数据测试同一个方法的时候 paramunittest是unittest实现参数化的一个专门的模块&#xff0c;可以传入多组参数&#xff0c;自动生成多个用例 实现unittest参数化的方式有多种&#xff0c;如ddt、paramunittest等…