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天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
随机推荐
- 数据结构与算法之顺序栈C语言实现
顺序栈是一种特殊的顺序表,主要操作是入栈和出栈.将顺序表加一些特定限制,就成了顺序栈. 注: 1.顺序栈C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简 ...
- QR码与DM码的区别
DM无法表现汉字等其他形式,而QR码能用数据压缩方式来表示汉字,仅用13bit即可表示一个汉字,比其他二维条码表示汉字的效率提高了20%.相较而言,DM码信息容量小,应用简单.而QR在汉字处理上更有优 ...
- HTML5的 input:file上传类型控制(转载)
http://www.haorooms.com/post/input_file_leixing HTML5的 input:file上传类型控制 2014年8月29日 66352次浏览 一.input: ...
- 【转】 The user specified as a definer ('root'@'') does not exist when using LOCK TALBE
在linux下,用mysql的导出语句: mysqldump -u root -pPasswd table >/home/lsf/test.sql 出现了 Got error: 1449: Th ...
- MSSSQL 脚本收藏
通配符 % : 表示0~n个任意字符 _ : 表示单个任意字符 [] :表示在括号里列出的任意字符 [^]:表示任意个没有在括号中列出的字符 1.创建数据库 2. 创建架构 /**** ...
- Android Studio 添加模块依赖
原文地址: http://fanjiajia.cn/2018/09/27/Android%20Studio%20%E6%B7%BB%E5%8A%A0%E6%A8%A1%E5%9D%97%E4%BE%9 ...
- PokeCats开发者日志(八)
现在是PokeCats游戏开发的第十四天的中午,很不幸著作权申请又被打回来了. 据说是排版后代码行数还差500行,文档不足十版.我擦,原来他们会自己排版的啊. 只好从项目自带的xml里扣代 ...
- Winform常用知识总结
Label中的文字自动换行 设置MaximumSize的width为正确的值,设置height为0,设置AutoSize为true. 绘制线条 放置一个Panel,设置size的高度为1,设置Bord ...
- [剑指Offer] 17.树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) [思路]要查找树A中是否存在和树B结构一样的子树,可以分成两步: 1.第一步在树A中找到和B的根节 ...
- [剑指Offer] 6.旋转数组的最小数字(二分法)
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...