物流运输……看了神犇的题解,就是dp+最短路,设f[i]为1~i天的最少花费,那么

dp[i]=min(cost[1,i],min{dp[j]+cost[j+1,i]+K,1≤j<i})

就是从第一天到第i天不变或者从某一个之前的状态转移过来。


具体实现比较简单了。有个细节,就是如何表示某个码头从da天到db天开不开放,用了一个s数组。设f(i)开放为0,不开放为1,那么当仅∑i=dadbf(i)=0 时,从da天到db天码头i畅通无阻。所以用一次区间累加,再用一次求前缀和总计两次求和,得到s数组。(应该就是离散的积分)

画个图:

贴代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std; const int MAXN = 110, MAXV = 25, MAXE = 500, INF = 0x3f3f3f3f;
struct edge{int to, cost, next;} es[MAXE];
int head[MAXV];
int s[MAXV][MAXN];
int dp[MAXN]; //1~i天总最小花费
int N, K, M, E, tot; inline void add2(const int &a, const int &b, const int &cost){
es[tot] = (edge){b, cost, head[a]}; head[a] = tot++;
es[tot] = (edge){a, cost, head[b]}; head[b] = tot++;
} int d[MAXV], vis[MAXV];
int SPFA(int da, int db){
queue<int> que;
memset(vis, 0, sizeof(vis));
memset(d, 0x3f, sizeof(d));
que.push(1); vis[1] = 1; d[1] = 0;
while(!que.empty()){
int u = que.front(); que.pop(); vis[u] = 0;
for(int i = head[u]; i != -1; i = es[i].next){
int v = es[i].to;
if(s[v][db] - s[v][da-1]) continue;
if(d[v] > d[u] + es[i].cost){
d[v] = d[u] + es[i].cost;
if(!vis[v]){
que.push(v);
vis[v] = 1;
}
}
}
}
// printf("day%d~day%d cost %d\n", da, db, d[M]);
return d[M];
} int main(){
freopen("in.txt", "r", stdin);
scanf("%d%d%d%d", &N, &M, &K, &E); memset(head, -1, sizeof(head));
int a, b, cost;
for(int i = 0; i < E; ++i){
scanf("%d%d%d", &a, &b, &cost);
add2(a, b, cost);
}
int d, v;
scanf("%d", &d);
for(int i = 0; i < d; ++i){
scanf("%d%d%d", &v, &a, &b);
++s[v][a];
--s[v][b+1];
}
for(int k = 0; k < 2; ++k){
for(v = 1; v <= M; ++v){
for(int i = 1; i <= N; ++i){
s[v][i] += s[v][i-1];
}
}
}
// for(v = 1; v <= M; ++v){
// for(int i = 1; i <= N; ++i){
// printf("s[%d][%d]=%d\n", v, i, s[v][i]);
// }
// }
for(int i = 1; i <= N; ++i){
dp[i] = SPFA(1, i);
if(dp[i] < INF) dp[i] *= i;
for(int j = 1; j < i; ++j){
int cost = SPFA(j + 1, i);
if(cost < INF)
dp[i] = min(dp[i], dp[j] + K + cost * (i - j));
}
}
printf("%d\n", dp[N]);
return 0;
}

BZOJ1003: [ZJOI2006] 物流运输 trans的更多相关文章

  1. bzoj1003[ZJOI2006]物流运输trans

    1003: [ZJOI2006]物流运输trans Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常 ...

  2. [BZOJ1003] [ZJOI2006] 物流运输trans (最短路 & dp)

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  3. 【动态规划】【spfa】【最短路】bzoj1003 [ZJOI2006]物流运输trans

    预处理cost[a][b] 表示第a天到第b天用同一条线路的成本. 具体转移看代码. #include<cstdio> #include<algorithm> #include ...

  4. BZOJP1003 [ZJOI2006]物流运输trans

    BZOJP1003 [ZJOI2006]物流运输trans 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MB Sub ...

  5. BZOJ 1003 [ZJOI2006]物流运输trans

    1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4242  Solved: 1765[Submit] ...

  6. BZOJ 1003: [ZJOI2006]物流运输trans(最短路+dp)

    1A,爽! cost[i][j]表示从第i天到第j天不改路线所需的最小花费,这个可以用最短路预处理出.然后dp(i)=cost[j][i]+dp(j-1)+c. c为该路线的花费. --------- ...

  7. bzoj1003 [ZJOI2006]物流运输

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6300  Solved: 2597[Submit][Stat ...

  8. bzoj1003: [ZJOI2006]物流运输(DP+spfa)

    1003: [ZJOI2006]物流运输 题目:传送门 题解: 可以用spfa处理出第i天到第j都走这条路的花费,记录为cost f[i]表示前i天的最小花费:f[i]=min(f[i],f[j-1] ...

  9. 【BZOJ1003】1003: [ZJOI2006]物流运输trans SPFA+DP

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

随机推荐

  1. django类视图简单使用和源码解析

    django的类视图,CBV: 我们在开始接触django的时候,习惯于使用函数编写视图,即FBV.使用FBV时,我们只需要在路由匹配时,对应的路由下找到这个函数就可以了,这样做看似很和谐,但是有的时 ...

  2. matlab mex 小o -o 出错

    https://github.com/kyamagu/mexopencv/issues/117 就是说2014a以后的版本mex   -o 选项变成了 -output 蛋疼,这有什么好改的.找了好久才 ...

  3. MSSSQL 脚本收藏

    通配符 % : 表示0~n个任意字符 ­ _ : 表示单个任意字符 ­ [] :表示在括号里列出的任意字符 ­ [^]:表示任意个没有在括号中列出的字符 ­ 1.创建数据库 2. 创建架构 /**** ...

  4. iOS版微信开发小结(微信支付,APP跳转微信公众号)

    最近公司心血来潮,一心要搞微信.废话不多说,直接上干货. 开发前准备: 1.在微信开发者平台获取开发者认证:(一年300元人民币) PS:具体流程按照微信流程指示操作即可,在这就不废话了. 2.下载微 ...

  5. 【EasyNetQ】- 多态发布和订阅

    您可以订阅接口,然后发布该接口的实现. 我们来看一个例子.我有一个接口IAnimal和两个实现Cat和Dog: public interface IAnimal { string Name { get ...

  6. PHP判断类型的方法

    1.gettype():获取变量类型 2.is_array():判断变量类型是否为数组类型 3.is_double():判断变量类型是否为倍浮点类型 4.is_float():判断变量类型是否为浮点类 ...

  7. Java中WeakHashMap实现原理深究

    一.前言 我发现Java很多开源框架都使用了WeakHashMap,刚开始没怎么去注意,只知道它里面存储的值会随时间的推移慢慢减少(在 WeakHashMap 中,当某个“弱键”不再正常使用时,会被从 ...

  8. EF 4.0 升级到 6.0 问题解决办法

    1.工具->库程序包管理器-> 管理解决方案的Nuget 程序包  找到EntityFramework 管理,勾选把需要进入 EF6.0的 项目,进行升级.

  9. ActiveMQ+Zookeeper集群配置文档

    Zookeeper + ActiveMQ 集群整合配置文档 一:使用ZooKeeper实现的MasterSlave实现方式 是对ActiveMQ进行高可用的一种有效的解决方案, 高可用的原理:使用Zo ...

  10. 【bzoj3033】太鼓达人 DFS欧拉图

    题目描述 给出一个整数K,求一个最大的M,使得存在一个每个位置都是0或1的圈,圈上所有连续K位构成的二进制数两两不同.输出最大的M以及这种情况下字典序最小的方案. 输入 一个整数K. 输出 一个整数M ...