BZOJ 1003 最短路dp
物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转
停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种
因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是
修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本
尽可能地小
第一行是四个整数n(1<=n<=100)、m(1<=m<=20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示
每次修改运输路线所需成本。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编
号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来
一行是一个整数d,后面的d行每行是三个整数P( 1 < P < m)、a、b(1< = a < = b < = n)。表示编号为P的码
头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一
条从码头A到码头B的运输路线
解法:
ans[i][j]表示从第i天到第j天 用可用节点从1到m的最短路为多少 如果不存在则为INT_MAX
dp[i]表示前i天最少的花费是多少
首先暴力枚举+Dij 处理出ans[i][j] 复杂度为O(n^2*m*loge)
其次直接dp 首先给dp[i]赋一个初值 初值为ans[1][i]*i 然后枚举哪天换线路转移方程为:
dp[i]=min(dp[i],dp[j]+ans[j+1][i]*(i-j)+K) 复杂度为O(n^2)
注意要用long long
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = , MAXM = ;
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], ed = ;
int cost[MAXM << ];
ll ans[][];
ll dp[];
inline void read(int &v)
{
v = ;
char c = ;
int p = ;
while (c < '' || c > '') {
if (c == '-') {
p = -;
}
c = getchar();
}
while (c >= '' && c <= '') {
v = (v << ) + (v << ) + c - '';
c = getchar();
}
v *= p;
}
inline void addedge(int u, int v, int c)
{
to[++ed] = v;
nxt[ed] = Head[u];
cost[ed] = c;
Head[u] = ed;
}
bool ok[MAXN][];
struct HeapNode {
int d, u;
bool operator < (const HeapNode& rhs) const
{
return d > rhs.d;
}
} zz;
int n, m, K, e;
ll mindist[MAXN];
bool vis[MAXN];
priority_queue<HeapNode> que;
bool could[MAXN];
ll Hijkstra(int s, int u, int v)
{
for (int i = ; i <= m; i++) {
mindist[i] = INT_MAX;
}
mindist[s] = ;
memset(could, , sizeof(could));
memset(vis, , sizeof(vis));
for (int i = ; i <= m; i++) {
for (int j = u; j <= v; j++) {
if (ok[i][j]) {
could[i] = true;
break;
}
}
}
zz.d = , zz.u = s;
que.push(zz);
while (!que.empty()) {
HeapNode x = que.top();
que.pop();
int u = x.u;
if (vis[u] || mindist[u] != x.d) {
continue;
}
vis[u] = true;
for (int v, i = Head[u]; i; i = nxt[i]) {
v = to[i];
if (could[v]) {
continue;
}
if (mindist[v] > mindist[u] + cost[i]) {
mindist[v] = mindist[u] + cost[i];
//p[v]=u;
zz.d = mindist[v], zz.u = v;
que.push(zz);
}
}
}
return mindist[m];
}
int main()
{
read(n), read(m), read(K), read(e);
int u, v, c;
for (int i = ; i <= e; i++) {
read(u), read(v), read(c);
addedge(u, v, c), addedge(v, u, c);
}
int d;
read(d);
for (int i = ; i <= d; i++) {
read(c), read(u), read(v);
for (int j = u; j <= v; j++) {
ok[c][j] = true;
}
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
ans[i][j] = Hijkstra(, i, j);
}
}
for (int i = ; i <= n; i++) {
dp[i] = ans[][i] * i;
for (int j = ; j < i; j++) {
dp[i] = min(dp[i], dp[j] + ans[j + ][i] * (i - j) + 1LL*K);
}
}
printf("%lld\n", dp[n]);
}
BZOJ 1003 最短路dp的更多相关文章
- bzoj 1003 最短路+dp
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8249 Solved: 3464[Submit][Stat ...
- BZoj 1003 物流运输 DP+最短路
2013-09-11 09:56 W[I]代表前I天能取得的最小花费,假设在第J天更改一次路线,那么如果有 W[I]>W[J]+第j+1到第I天的最小花费+更改路线的花费(K) 那么更新W[I] ...
- BZOJ 1003 物流运输 (dp + dijkstra)
1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8672 Solved: 3678[Submit][Stat ...
- BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...
- BZOJ 1003 物流运输 题解 【SPFA+DP】
BZOJ 1003 物流运输 题解 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的 ...
- BZOJ_1003_[ZJOI2006]物流运输_最短路+dp
BZOJ_1003_[ZJOI2006]物流运输_最短路+dp 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 分析: 这种一段一段的显 ...
- AC日记——[ZJOI2006]物流运输 bzoj 1003
1003 思路: 最短路+dp: 节点在a-b天里不能使用 那么我们准备每一组a-b求一条最短路,如果没有,则用极大值表示: cost[a,b]记录这个最短路: 然后,开始dp: dp[i]=min( ...
- BZOJ 1003 物流运输
最短路+dp. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...
- hdu 4568 Hunter 最短路+dp
Hunter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
随机推荐
- JS&和&&-T
&&逻辑与 &按位与(转换为二进制运算) console.log(1&2); console.log(1&&2); 上面打印的结果是什么呢? 先复习一下 ...
- 安装aodh
在控制节点上执行 #!/bin/bash MYSQL_ROOT_PASSWD='m4r!adbOP' GNOCCHI_PASSWD='gnocchi1234!' CEILOMETER_PASSWD=' ...
- css 左右固定宽度,中间自适应的三列布局
float——浮动布局: 使用浮动,先渲染左右两个元素,分别让他们左右浮动,然后再渲染中间元素,设置它的margin左右边距分别为左右两个元素的宽度. <!DOCTYPE html> &l ...
- SDF:Software-Defined Flash for Web-Scale Internet Storage System
一.参考 http://www.csdn.net/article/a/2013-12-18/309280 http://gtstorageworld.blog.51cto.com/908359/126 ...
- 2019牛客暑期多校训练营(第七场)-H Pair(数位dp)
题目链接:https://ac.nowcoder.com/acm/contest/887/H 题意:给定A,B,C,求有多少对(x,y)满足x&y>C或者x^y<C,其中1< ...
- Java时间处理
java.sql.PreparedStatement接口的setDate(int parameterIndex, java.sql.Date x)方法中的Date为java.sql包下的Date,而不 ...
- strCmd.Format("delete FROM userTable where name = '%s'", name);
string.Format("select * from 数据库表 where 用户名='%s' and 密码='%s' ",m_1,m_2); 把[m_1]和[m_2]的值按照[ ...
- PAT B1022 D进制的A+B
课本AC代码 #include <cstdio> int main() { int a, b, d; scanf("%d%d%d", &a, &b, & ...
- 怎样使用 ssh 命令远程连接服务器?
以 Git Bash 和 阿里云 ECS云服务器 为例, 想要进行远程连接, 可以使用 ssh 用户名@服务器IP 进行连接. 如下: 注意: 1. 密码输入时是没有提示的 2. root 是超级管理 ...
- iframe父子页面通信
一.同域下父子页面的通信 1.父页面调用子iframe页面 (1)通过iframe的Id获取子页面的dom,然后通过内置属性contentWindow取得子窗口的window对象,此方法兼容各个浏览器 ...