Luogu1772 [ZJOI2006] 物流运输
简化题意
给你 \(m\) 个码头,码头之间有双向边连接,\(n\) 天,其中一些码头在某些天会不可用,这 \(n\) 天都要有一条从 \(1\) 到 \(m\) 的路,每一次更换道路会需要 \(k\) 的代价,求这 \(n\) 天每天从 \(1\) 到 \(m\) 的距离之和与更改道路的价值之和的最小值。
Solution
首先我们能想到一个贪心的策略:在保证最短路的同时,需要保证更换道路尽可能少。
然后0我们可以想到令 \(cost_{i,j}\) 为从第 \(i\) 天到第 \(j\) 天走同一条路径的最短长度和,\(f_i\) 为第 \(i\) 天的 \(ans\) 值,于是我们可以列出状态转移方程:
\]
接下来,我们来处理 \(cost{i, j}\),我们发现只要 \(x\) 号码头在 \(i\) 到 \(j\) 天封闭过一次,在 \(i\) 到 \(j\) 天的路径里就不能选它,所以只需要在跑最短路时判一下 \(x\) 号点是否被封禁即可。
注:若 \(i\) 到 \(j\) 天不能从 \(1\) 走到 \(m\),就把 \(const_{i,j}\) 赋值为 \(INF\) 即可。
时间复杂度
约为 \(O(n^3m)\)
代码实现
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define int long long // 不开longlong见祖宗
const int Days = 105, N = 25, M = 405;
int n, m, k, e, Q, x, y, w;
int la[N], en[M], ne[M], len[M], idx;
int dis[N], f[Days], cost[Days][Days];
bool st[N], lock[N], timlock[N][Days];
queue<int > q;
void add(int x, int y, int z) {
en[ ++ idx] = y;
ne[idx] = la[x];
la[x] = idx;
len[idx] = z;
}
void spfa(int l, int r) {
memset(dis, 0x3f3f3f3f, sizeof dis);
q.push(1), dis[1] = 0, st[1] = 1;
while(q.size()) {
int u = q.front();
st[u] = 0; q.pop();
for (int i = la[u]; i; i = ne[i]) {
int v = en[i];
if(lock[v]) continue;
if(dis[v] > dis[u] + len[i]) {
dis[v] = dis[u] + len[i];
if(!st[v]) {
q.push(v);
st[v] = 1;
}
}
}
}
cost[l][r] = (dis[m]>=0x3f3f3f3f3f3f3f3f ? 1 : r - l + 1) * dis[m];
}
signed main(){
ios::sync_with_stdio(0);
cin >> n >> m >> k >> e;
while(e -- ) {
cin >> x >> y >> w;
add(x, y, w); add(y, x, w); // 注意是双向边
}
cin >> Q;
while(Q -- ) {
cin >> w >> x >> y;
for (int i = x; i <= y; ++ i ) timlock[w][i] = 1; //打标记
}
for (int i = 1; i <= n; ++ i )
for (int j = i; j <= n; ++ j ) {
for (int l = 1; l <= m; ++ l )
for (int tim = i; tim <= j; ++ tim ) {
lock[l] |= timlock[l][tim];
if(lock[l]) break;
}
spfa(i, j);
for (int l = 1; l <= m; ++ l ) lock[l] = 0; //记得清空
}
for (int i = 1; i <= n; ++ i ) {
f[i] = cost[1][i]; //初始化为全用一条路
for (int j = 1; j < i; ++ j ) {
f[i] = min(f[i], f[j] + k + cost[j + 1][i]);
}
}
cout << f[n];
return 0;
}
Luogu1772 [ZJOI2006] 物流运输的更多相关文章
- [luogu1772 ZJOI2006] 物流运输 (最短路 线性dp)
题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...
- [ZJOI2006]物流运输
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5999 Solved: 2473[Submit][Stat ...
- bzoj1003 [ZJOI2006]物流运输
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6300 Solved: 2597[Submit][Stat ...
- 【bzoj1003】[ZJOI2006]物流运输
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6331 Solved: 2610[Submit][Stat ...
- bzoj1003: [ZJOI2006]物流运输
dp+最短路.暴力枚举就可以了.O(n3logn).样例中m=n然后测样例过了.然后 54行习惯性的dis[n]然后就WA了!!!. #include<cstdio> #include&l ...
- BZOJP1003 [ZJOI2006]物流运输trans
BZOJP1003 [ZJOI2006]物流运输trans 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MB Sub ...
- BZOJ 1003 [ZJOI2006]物流运输trans
1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4242 Solved: 1765[Submit] ...
- bzoj1003[ZJOI2006]物流运输trans
1003: [ZJOI2006]物流运输trans Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常 ...
- BZOJ 1003: [ZJOI2006]物流运输trans(最短路+dp)
1A,爽! cost[i][j]表示从第i天到第j天不改路线所需的最小花费,这个可以用最短路预处理出.然后dp(i)=cost[j][i]+dp(j-1)+c. c为该路线的花费. --------- ...
- BZOJ_1003_[ZJOI2006]物流运输_最短路+dp
BZOJ_1003_[ZJOI2006]物流运输_最短路+dp 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 分析: 这种一段一段的显 ...
随机推荐
- 什么是Markdown
什么是markdown? Markdown是一种轻量级标记语言,它允许人们使用已读一些的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档.这种语言吸收了很多在电子邮件中已有的纯文本标 ...
- mysql5.7修改数据库密码&开通外界访问
mysql修改数据库密码(版本5.7.33) 参考博客: 改密码:https://blog.csdn.net/m0_37482190/article/details/86635339 允许外界访问:h ...
- 项目构建node-sass源码报错 SyntaxError:Unexpectedtoken"?"
背景 vue2项目,之前一直构建正常.今天改了代码,构建时报错,报错原因显示编译node-sass源码时出错. 报错信息: Modulebuild failed:/node_modules/node- ...
- aspnetcore微服务中使用发件箱模式实例
aspnetcore微服务种服务之间的通信一般都有用到消息中间件,如何确保该服务的持久层保存创建的数据同时又把消息成功投递到了关联服务,关联服务做对应的处理. 下面就以一个简单的例子来演示实现方式之一 ...
- Win11右键菜单改回传统样式
Win11右键菜单,比较不人性化,隐藏了一些常用选项,需要点"更多选项"才能显示,多次一举. 解决方法,一句话: reg.exe add "HKCU\Software\C ...
- 中国省市区--地区SQL表
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for rc_district -- ---- ...
- bash shell 无法使用 perl 正则
哈喽大家好,我是咸鱼.今天跟大家分享一个关于正则表达式的案例,希望能够对你有所帮助 案例现象 前几天有一个小伙伴在群里求助,说他这个 shell 脚本有问题,让大家帮忙看看 可以看到,这个脚本首先 ...
- C++核心知识回顾(函数&参数、异常、动态分配)
复习C++的核心知识 函数与参数 传值参数.模板函数.引用参数.常量引用参数 传值参数 int abc(int a,int b,int c) { return a + b * c; } a.b.c是函 ...
- Kubernetes入门实践(YAML)
YAML是Kubernetes的标准工作语言 YAML介绍 Kubernetes使用了YAML语言一个非常关键的特性,叫作"声明式",对应的有另外一个词: "命令式&qu ...
- 【python基础】定时任务框架APScheduler
1. 基础概念 APScheduler是python中较为简洁直观的定时任务框架,提供了基于固定日期.时间间隔.crontab表达式三种任务类型,并且可以持久化任务(如:将定时任务保存到mysql中) ...