2018.09.02 bzoj1003: [ZJOI2006]物流运输(dp+最短路转移)
传送门
dp好题。
每一天要变更路线一定还是走最短路。
所以l~r天不变更路线的最优方案就是把l~r天所有不能走的点都删掉再求最短路。显然是可以dp的。
设f[i]表示第i天的最优花销。那么我们枚举在哪里切换路线更优,则有状态转移方程:
f[i]=min(f[j]+spfa(j,i)∗(i−j)+k)(j=1...i−1)" role="presentation" style="position: relative;">f[i]=min(f[j]+spfa(j,i)∗(i−j)+k)(j=1...i−1)f[i]=min(f[j]+spfa(j,i)∗(i−j)+k)(j=1...i−1)
其中spfa时只有合法的点参与。
另外可以bitset优化一波。
代码:
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int day,n,K,E,f[105],cnt=0,first[30],d[30];
struct edge{int v,w,next;}e[20000];
bool in[30];
bitset<21>del[105];
inline void add(int u,int v,int w){e[++cnt].v=v,e[cnt].next=first[u],e[cnt].w=w,first[u]=cnt;}
inline int spfa(int l,int r){
queue<int>q;
bitset<21>dell;
for(int i=l;i<=r;++i)dell|=del[i];
for(int i=1;i<=n;++i)in[i]=false,d[i]=inf;
q.push(1),d[1]=0,in[1]=true;
while(!q.empty()){
int x=q.front();
q.pop(),in[x]=false;
for(int i=first[x];i;i=e[i].next){
int v=e[i].v;
if(dell[v])continue;
if(d[v]>d[x]+e[i].w){
d[v]=d[x]+e[i].w;
if(!in[v])in[v]=true,q.push(v);
}
}
}
return d[n];
}
int main(){
day=read(),n=read(),K=read(),E=read();
for(int i=1;i<=E;++i){
int a=read(),b=read(),c=read();
add(a,b,c),add(b,a,c);
}
int d=read();
while(d--){
int tmp=read(),a=read(),b=read();
for(int i=a;i<=b;++i)del[i][tmp]=1;
}
f[1]=spfa(1,1);
for(int i=2;i<=day;++i){
int tmp=spfa(1,i);
if(tmp!=inf)f[i]=tmp*i;
else f[i]=inf;
for(int j=1;j<i;++j){
tmp=spfa(j+1,i);
if(tmp!=inf)f[i]=min(f[i],f[j]+K+(i-j)*tmp);
}
}
cout<<f[day];
return 0;
}
2018.09.02 bzoj1003: [ZJOI2006]物流运输(dp+最短路转移)的更多相关文章
- [BZOJ1003] [ZJOI2006] 物流运输trans (最短路 & dp)
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- P1772 [ZJOI2006]物流运输[DP+最短路]
题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...
- BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...
- [ZJOI2006]物流运输 DP 最短路
---题面--- 题解: 设f[i]表示到第i天的代价,cost[i][j]表示第i天到第j天采取同一种方案的最小代价.那么转移就很明显了,直接$n^2$枚举即可. 所以问题就变成了怎么获取cost数 ...
- BZOJ_1003_[ZJOI2006]物流运输_最短路+dp
BZOJ_1003_[ZJOI2006]物流运输_最短路+dp 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 分析: 这种一段一段的显 ...
- bzoj1003: [ZJOI2006]物流运输(DP+spfa)
1003: [ZJOI2006]物流运输 题目:传送门 题解: 可以用spfa处理出第i天到第j都走这条路的花费,记录为cost f[i]表示前i天的最小花费:f[i]=min(f[i],f[j-1] ...
- bzoj1003 [ZJOI2006]物流运输
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6300 Solved: 2597[Submit][Stat ...
- 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为该路线的花费. --------- ...
随机推荐
- ios app 生命周期
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/The ...
- RabbitMq install on Centos
安装服务(root) erlang官方安装说明:https://www.erlang-solutions.com/resources/download.html step 1: 安装erlang的yu ...
- unity WWW加载进度条
using UnityEngine; using System.Collections; public class testProgress : MonoBehaviour { void Start ...
- ant使用备忘
ant是一个脚本构建工具,可能就是持续集成里面所需要的构建工具. 如果使用eclipse,里面会自带有ant工具,不需要再安装了,创建一个build.xml(或者其他的名字都可以),使用ant来运行就 ...
- ASP.NET MVC 项目文件夹结构
首先,打开Visual Studio, 新建一个demo 项目的solution,选择 Blank Soution. 第二步,创建文件夹,按自己的需求创建.在这个Demo 中,我将创建4个文件夹. P ...
- Java8Stream
判断一个操作是惰性求值还是及早求值很简单:只需看它的返回值.如果返回值是 Stream,那么是惰性求值.其实可以这么理解,如果调用惰性求值方法,Stream 只是记录下了这个惰性求值方法的过程,并没有 ...
- 配置python学习环境遇到的问题:[Decode error - output not utf-8]
因为前阵子学习monkeyrunner的时候,碰到了很多关于.py的脚本,其实我是一知半解的,也没打算去学习一下.将就着看看吧,后来无意中看到自动化测试工程师都要求会脚本语言的时候,刺激了我,想了想, ...
- Java获取资源文件
比如我们有以下目录 |--project |--src |--javaapplication |--Test.java |--file1.txt |--file2.txt |--build |--ja ...
- TZOJ 1242 求出前m大的数(预处理)
描述 给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=10000)并按从大到小的顺序排列. 输入 ...
- python之socket运用1
先看下服务端的代码 import socket ip_bind = ("127.0.0.1",3000) sk = socket.socket() sk.bind(ip_bind) ...