~~~题面~~~

题解:

  设f[i]表示到第i天的代价,cost[i][j]表示第i天到第j天采取同一种方案的最小代价。那么转移就很明显了,直接$n^2$枚举即可。

  所以问题就变成了怎么获取cost数组。因为i到j都采取同一种方案,因此这种方案不能经过在i到j这些天出现故障的码头,因为要求的是最小代价,因此直接跑最短路,然后注意判断一下不能经过在i到j会出现故障的码头即可。

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 110
#define ac 450
int n, m, k, e, d;
int Head[AC], date[ac], Next[ac], len[ac], tot;
int dis[AC], f[AC], cost[AC][AC], sum[AC][AC];//sum[天][码头]
bool z[AC]; struct cmp{
bool operator () (int a, int b)
{
return dis[a] < dis[b];
}
}; priority_queue<int, vector<int>, cmp> q; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} inline void add(int f, int w, int S)
{
date[++tot] = w, Next[tot] = Head[f], Head[f] = tot, len[tot] = S;
date[++tot] = f, Next[tot] = Head[w], Head[w] = tot, len[tot] = S;
} void upmin(int &a, int b)
{
if(b < a) a = b;
} void spfa(int l, int r)
{
int x, now;
memset(dis, , sizeof(dis));
dis[] = ;
q.push(), z[] = true;
while(!q.empty())
{
x = q.top();
q.pop();
z[x] = false;
for(R i = Head[x]; i; i = Next[i])
{
now = date[i];
if(sum[r][now] - sum[l - ][now]) continue;//如果这几天中故障过就不能用
if(dis[now] > dis[x] + len[i])
{
dis[now] = dis[x] + len[i];
if(!z[now]) q.push(now), z[now] = true;
}
}
}
if(dis[m] != dis[]) cost[l][r] = dis[m] * (r - l + );
else cost[l][r] = dis[m];//防爆
} void pre()
{
int a, b, c;
n = read(), m = read(), k = read(), e = read();
for(R i = ; i <= e; i ++)
{
a = read(), b = read(), c = read();
add(a, b, c);
}
d = read();
for(R i = ; i <= d; i ++)
{
a = read(), b = read(), c =read();
for(R j = b; j <= c; j ++) sum[j][a] = ;
}
for(R i = ; i <= m; i ++)//枚举码头
for(R j = ; j <= n; j ++)
sum[j][i] += sum[j - ][i];
} void work()
{
for(R i = ; i <= n; i ++)
for(R j = i; j <= n; j ++) spfa(i, j);
memset(f, , sizeof(f));
f[] = -k;//因为第一天不用承受换方案的代价
for(R i = ; i <= n; i ++)//枚举天数
for(R j = ; j < i; j ++)//枚举上一段的结尾
upmin(f[i], f[j] + cost[j + ][i] + k);
printf("%d\n", f[n]);
} int main()
{
// freopen("in.in", "r", stdin);
pre();
work();
// fclose(stdin);
return ;
}

[ZJOI2006]物流运输 DP 最短路的更多相关文章

  1. P1772 [ZJOI2006]物流运输[DP+最短路]

    题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...

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

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

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

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

  4. BZOJ 1003: [ZJOI2006]物流运输trans(最短路+dp)

    1A,爽! cost[i][j]表示从第i天到第j天不改路线所需的最小花费,这个可以用最短路预处理出.然后dp(i)=cost[j][i]+dp(j-1)+c. c为该路线的花费. --------- ...

  5. bzoj 1003 [ZJOI2006]物流运输(最短路+dp)

    [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8973  Solved: 3839[Submit][Status][Di ...

  6. [BZOJ1003] [ZJOI2006] 物流运输trans (最短路 & dp)

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  7. 1003: [ZJOI2006]物流运输 = DP+SBFA

    题意就是告诉你有n个点,e条边,m天,每天都会从起点到终点走一次最短路,但是有些点在某些时间段是不可走的,因此在某些天需要改变路径,每次改变路径的成本是K,总成本=n天运输路线长度之和+K*改变运输路 ...

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

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

  9. [luogu] P1772 [ZJOI2006]物流运输(动态规划,最短路)

    P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...

随机推荐

  1. 【mvrp多协议vlan注册协议给予三种注册方式的验证】

    MVRP 多vlan注册协议给予三种注册模式的配置 一:根据项目需求搭建好拓扑图如下 二:配置: 首先对项目做理论分析,sw1,sw2,sw3所组成的直连网络中,为使不同的PC之间进行通信,按vlan ...

  2. pywinauto 使用

    Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面.它可以允许你很容易的发送鼠标.键盘动作给Windows的对话框和控件.  其中,最主要功能为 ...

  3. 程序设计的SOLID原则

    要想设计一个良好的程序,建议采用SOLID原则,若考虑了SOLID,可以使程序在模块内具有高内聚.而模块间具有低耦合的特点. SOLID原则包括5方面的内容: S---单责任原则(SRP) 一个模块只 ...

  4. python基础小知识,is和==的区别,编码和解码

    1.is和==的区别 1)id() 通过id()我们可以查看到一个变量表示的值在内存中的地址 >>> s1 = "Tanxu" >>> s2 = ...

  5. POJ2762 单向连通图(缩点+拓扑排序

    Going from u to v or from v to u? Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19552 ...

  6. [POJ1785]Binary Search Heap Construction(笛卡尔树)

    Code #include <cstdio> #include <algorithm> #include <cstring> #define N 500010 us ...

  7. ssrf小记

    SSRF(Server-Side Request Forgery, 服务端请求伪造),攻击者伪造服务端发起的请求并执行,从而获得一些数据或进行攻击 一.危害 1.对内网的端口和服务进行扫描,对主机本地 ...

  8. 公用的cefsharp窗口

    书接上回,.net实现一个nw,一个字,简单. 结构,无废话,上图. 要说这部分上回展示过的,大致结构如此,其实要说清楚结构,还是得从工作流程开始说起 流程 1.通过桌面的快捷方式启动WebOnDes ...

  9. jmeter常用的内置变量

    1. vars   API:http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html vars.get(& ...

  10. EFT4 生成实体类

    创建T4模本拷贝以下代码 <#@ template language="C#" debug="false" hostspecific="true ...