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# 把List<T>转成DataTable对象,批量导入Sqlserver库
/// <summary> /// Sqlbulkcopies the specified SMS.批量插入到数据库 /// </summary> /// <param ...
- 软件工程项目组Z.XML会议记录 2013/11/20
软件工程项目组Z.XML会议记录 [例会时间]2013年11月20日星期三21:00-22:00 [例会形式]小组讨论 [例会地点]学生公寓3号楼会客厅 [例会主持]李孟 [会议记录]李孟 会议整体流 ...
- Linux 进程,线程,线程池
在linux内核,线程与进程的区别很小,或者说内核并没有真正所谓单独的线程的概念,进程的创建函数是fork,而线程的创建是通过clone实现的. 而clone与fork都是调用do_fork(),差异 ...
- 基于SDN的IP RAN网络虚拟化技术
http://www.zte.com.cn/cndata/magazine/zte_technologies/2014/2014_4/magazine/201404/t20140421_422858. ...
- iOS版微信开发小结(微信支付,APP跳转微信公众号)
最近公司心血来潮,一心要搞微信.废话不多说,直接上干货. 开发前准备: 1.在微信开发者平台获取开发者认证:(一年300元人民币) PS:具体流程按照微信流程指示操作即可,在这就不废话了. 2.下载微 ...
- SQL 视图 局部变量 全局变量 条件语句 事务 触发器
一.视图 1.视图是一张虚拟表,他所存储的不是实际数据,而是查询语句,但我们可以对视图进行像数据表一样的操作. 2.为什么使用视图呢?我的理解是:1.在远程传输数据时,可以避免过长的查询字符,减少流量 ...
- 在 Linux 安装 JDK 和 tomcat(菜鸡级别)
安装JDK 卸载 OPENJDK rpm -qa|grep jdk // 查看当前的jdk情况 yum -y remove java java-1.7.0-openjdk* // 卸载openjdk ...
- 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块
题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...
- 【莫比乌斯反演】51nod1594 Gcd and Phi
题解 显然可以O(nlogn)计算 代码 //by 减维 #include<set> #include<map> #include<queue> #include& ...
- [hdu 1398]简单dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1398 看到网上的题解都是说母函数……为什么我觉得就是一个dp就好了,dp[i][j]表示只用前i种硬币 ...