物流公司要把一批货物从码头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的更多相关文章

  1. bzoj 1003 最短路+dp

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

  2. BZoj 1003 物流运输 DP+最短路

    2013-09-11 09:56 W[I]代表前I天能取得的最小花费,假设在第J天更改一次路线,那么如果有 W[I]>W[J]+第j+1到第I天的最小花费+更改路线的花费(K) 那么更新W[I] ...

  3. BZOJ 1003 物流运输 (dp + dijkstra)

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

  4. BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)

    题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...

  5. BZOJ 1003 物流运输 题解 【SPFA+DP】

    BZOJ 1003 物流运输 题解 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的 ...

  6. BZOJ_1003_[ZJOI2006]物流运输_最短路+dp

    BZOJ_1003_[ZJOI2006]物流运输_最短路+dp 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 分析: 这种一段一段的显 ...

  7. AC日记——[ZJOI2006]物流运输 bzoj 1003

    1003 思路: 最短路+dp: 节点在a-b天里不能使用 那么我们准备每一组a-b求一条最短路,如果没有,则用极大值表示: cost[a,b]记录这个最短路: 然后,开始dp: dp[i]=min( ...

  8. BZOJ 1003 物流运输

    最短路+dp. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...

  9. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

随机推荐

  1. 制作VB项目打包工具与安装程序

    该原因起于错误429. 当然比起自制我更推荐使用其他的功能完整的打包软件. 犹豫各种原因,导致三分钟热情被浇灭...本来想划四个部分详细讲教程的,大家看成品源码就好了,心好累. http://www. ...

  2. RestTemplate连接池(转载)

    出处:http://zhangzhi19861216.cnblogs.com/ spring-boot RestTemplate 连接池 以前我们项目都是基于Apache HttpClient 连接池 ...

  3. 《JAVA语言》课问题汇总

    一.阅读相应教材,或者使用互联网搜索引擎,弄清楚反码.补码跟原码这几个概念,然后编写示例程序,对正数.负数进行各种位操作,观察输出结果,与手工计算的结果进行比对,看看Java中的数是采用上述哪种码表示 ...

  4. Python 中__new__()和__init__()的区别

    转自: https://blog.csdn.net/weixin_37579123/article/details/89515577 __new__方法:类级别的方法 特性: 1.是在类准备将自身实例 ...

  5. 【转帖】linux sort,uniq,cut,wc,tr,xargs命令详解

    linux sort,uniq,cut,wc,tr,xargs命令详解 http://embeddedlinux.org.cn/emb-linux/entry-level/201607/21-5550 ...

  6. uname、hostname命令

    一.uname:显示系统信息. 语法:       uname [OPTION] ... 描述        打印某些系统信息. 没有选项,与-s相同. -a,--all               ...

  7. 使用JavaScript和React编写原生移动应用

    使用JavaScript和React编写原生移动应用 React Native使你只使用JavaScript也能编写原生移动应用. 它在设计原理上和React一致,通过声明式的组件机制来搭建丰富多彩的 ...

  8. MVC进阶讲解+小技巧-乱七八糟

    开发步骤 1.建立项目 2.建立文件夹 3.建立Controllers 4.生成页面 5.编写Html+Js 6.编写异步请求的Action的方法,返回部分页(用于分页) 7.Js中显示部分页 8.增 ...

  9. day07 类

    一.目录 1.模块 2.包 3.isinstance issubclass type 4.方法和函数 5.反射 6.约束 7.继承 8.特殊成员 9.异常处理 补充知识点 10.hashlib模块 1 ...

  10. Editplus code

    网上一大堆,垃圾也是一大堆,保留一个真正的,提高效率 原文链接:https://blog.csdn.net/anhldd/article/details/85088715 Vovan 3AG46-JJ ...