~~~题面~~~

题解:

  设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. JS日期去杠,日期转换String转Date

    1.巧妙使用split()和join()替换字符串var str = '2014-05-05';var newstr = str.split('-').join("");split ...

  2. 三、css篇

    #这里强烈推荐一本书<css世界>,css第一书. #上面的层叠顺序得记住. 1.align-items  justify-content 是flex(弹性盒模型)必须要会的属性,alig ...

  3. vs2013中将复制过来的文件或文件夹显示到解决方案管理

    先将文件夹和文件复制到VS程序所在的位置,在VS2013解决方案资源管理器中找到这些文件所在的上一级文件夹,先将那个上层文件夹收缩起来,然后再点击解决方案资源管理器上的“显示所有文件”按纽,展开这个文 ...

  4. [转]Android UI 自动化测试

    介绍 Android测试支持库包含UI自动化模块,它可以对Android应用进行自动黑盒测试.在API Level 18中引入了自动化模块,它允许开发者在组成应用UI的控件上模仿用户行为. 在这个教程 ...

  5. jmeter常用的内置变量

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

  6. Kotlin 1 函数

    #2 函数 函数声明和平时我见到的有点不太一样,使用关键字fun来声明.(感觉好欢乐的样子···O(∩_∩)O~~) 下面的示例,简单的声明了一个函数: // 这是函数声明 fun this_is_a ...

  7. 『Golang』MongoDB在Golang中的使用(mgo包)

    有关在Golang中使用mho进行MongoDB操作的最简单的例子.

  8. ionic 向路由中的templateUrl(模板页)传值

    .state('product', { url: '/product/:id', templateUrl: function ($routeParams) { return '/Product/Ind ...

  9. Viewer.js 图片预览插件使用

    一.简介 Viewer.js 是一款强大的图片查看器. Viewer.js 有以下特点: 支持移动设备触摸事件 支持响应式 支持放大/缩小 支持旋转(类似微博的图片旋转) 支持水平/垂直翻转 支持图片 ...

  10. Qt Qml 汽车仪表

    上一个原文连接http://blog.csdn.net/z609932088/article/details/53946245 参考资料连接:链接: https://pan.baidu.com/s/1 ...