BZOJ1003: [ZJOI2006] 物流运输 trans
物流运输……看了神犇的题解,就是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的更多相关文章
- bzoj1003[ZJOI2006]物流运输trans
1003: [ZJOI2006]物流运输trans Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常 ...
- [BZOJ1003] [ZJOI2006] 物流运输trans (最短路 & dp)
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- 【动态规划】【spfa】【最短路】bzoj1003 [ZJOI2006]物流运输trans
预处理cost[a][b] 表示第a天到第b天用同一条线路的成本. 具体转移看代码. #include<cstdio> #include<algorithm> #include ...
- 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] ...
- BZOJ 1003: [ZJOI2006]物流运输trans(最短路+dp)
1A,爽! cost[i][j]表示从第i天到第j天不改路线所需的最小花费,这个可以用最短路预处理出.然后dp(i)=cost[j][i]+dp(j-1)+c. c为该路线的花费. --------- ...
- bzoj1003 [ZJOI2006]物流运输
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6300 Solved: 2597[Submit][Stat ...
- bzoj1003: [ZJOI2006]物流运输(DP+spfa)
1003: [ZJOI2006]物流运输 题目:传送门 题解: 可以用spfa处理出第i天到第j都走这条路的花费,记录为cost f[i]表示前i天的最小花费:f[i]=min(f[i],f[j-1] ...
- 【BZOJ1003】1003: [ZJOI2006]物流运输trans SPFA+DP
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
随机推荐
- 剑指offer-调整数组顺序使奇数位于偶数前面13
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. class Solu ...
- UVA 11884 A Shooting Game(记忆化搜索)
A and B are playing a shooting game on a battlefield consisting of square-shaped unit blocks. The bl ...
- [整理]docker内部时区修改的两种方法
方法一 终端执行 date命令,查看宿主服务器的时区是否正确 如果正确: 执行 docker cp /etc/localtime 容器ID:/etc/localtime 将本地时间拷贝到docker内 ...
- 健康领域今年开始井喷了,养老地产和私人医生这两个领域目测成为下一轮BAT在健康领域布局的竞争方向
医疗行业做了六年多的时间,今年到了井喷的阶段,腾讯先是入股了丁香园,然后又一亿美金融资挂号网,春雨医生获得5000万美元的C轮融资,这是要上市的节奏.. 从互联网战略上,健康网和医疗网都是做资料刚开始 ...
- 【Linux】Linux修改openfiles后不生效问题?
#次故障问题环境背景: Centos7.4物理机,升级过ssh和ntp: #一般只需要在此文件后面添加4行就行,配置后即可生效(exit再次登录即可生效),此次配置后没生效,reboot还是没生效,在 ...
- 批处理之FOR命令
- P3444 [POI2006]ORK-Ploughing
题目描述 Byteasar, the farmer, wants to plough his rectangular field. He can begin with ploughing a slic ...
- GDI+小例子
原文链接地址:http://www.cnblogs.com/chuanzifan/archive/2011/11/26/2264507.html 1.在stdafx.h中 #include <G ...
- SCU3037 Painting the Balls
Description Petya puts the \(N\) white balls in a line and now he wants to paint some of them in bla ...
- [NOIP2003] 传染病控制 搜索+剪枝
搜索的最广泛应用优化——剪枝 这道题的dp和贪心都是无正确性的,所以,搜~~~~~~~ 搜的时候你发现不剪枝极容易被卡掉(然而良心NOIP没有这么做,不剪枝仍然飞快),所以我们需要一些玄学的剪枝最常见 ...