题目链接

http://www.lydsy.com/JudgeOnline/problem.php?id=1003

思路

先Dijkstra暴力求出i..j天内不变换路线的最少花费,然后dp[i] = min(cost[1..i], dp[j]+cost[j+1][i]+K).

总结:

1. BZOJ 题目质量果然高啊……做一道一次升华……

2.自己太弱……

代码

[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
using namespace std;

struct edge{
int v, w;
edge(int _v, int _w){
v = _v, w = _w;
}
};
typedef vector <edge> VI;
priority_queue <pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > PQ;
const int maxn = 25;
VI adj[maxn];
int n, m, K, e, d;
int cost[105][105], dist[maxn], flag[25][105], dp[105];
bool vis[maxn];

void dij(int l, int r){
while(!PQ.empty()) PQ.pop();
MEM(vis, 0);
for (int i = 2; i <= m; i ++) dist[i] = 0x3fffffff;
for (int i = 1; i <= m; i ++)
for (int j = l; j <= r; j ++)
if (flag[i][j]){
vis[i] = 1;
break;
}
dist[1] = 0;
PQ.push(make_pair(0, 1));
while(!PQ.empty()){
int u = PQ.top().second;
PQ.pop();
for (int i = 0; i < (int)adj[u].size(); i ++){
int v = adj[u][i].v;
if (!vis[v] && dist[v] > dist[u] + adj[u][i].w){
dist[v] = dist[u] + adj[u][i].w;
PQ.push(make_pair(dist[v], v));
}
}
}
if (dist[m] != 0x3fffffff)
cost[l][r] = (r - l + 1) * dist[m];
else
cost[l][r] = 0x3fffffff;
//printf("l = %d r = %d cost = %d\n", l, r, cost[l][r]);
}

int main(){
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
scanf("%d %d %d %d", &n, &m, &K, &e);
for (int i = 0; i <= m; i ++) adj[i].clear();
for (int i = 0; i < e; i ++){
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
adj[u].push_back(edge(v, w));
adj[v].push_back(edge(u, w));
}
scanf("%d", &d);
MEM(flag, 0);
for (int i = 0; i < d; i ++){
int p, l, r;
scanf("%d %d %d", &p, &l, &r);
for(int j = l; j <= r; j ++)
flag[p][j] = 1;
}
for (int i = 1; i <= n; i ++){
for (int j = i; j <= n; j ++){
dij(i, j);
}
}
for (int i = 1; i <= n; i ++) dp[i] = 0x3fffffff;
dp[0] = 0;
for (int i = 1; i <= n; i ++){
dp[i] = cost[1][i];
for (int j = 0; j < i; j ++){
if (cost[j+1][i] == 0x3fffffff) continue;
dp[i] = min(dp[i], dp[j] + cost[j+1][i] + K);
}
}
printf("%d\n", dp[n]);
return 0;
}
[/cpp]

BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)的更多相关文章

  1. BZOJ 1003 [ZJOI2006]物流运输trans SPFA+DP

    题意:链接 方法:SPFA+DP 解析:挺好的题目.因为数据范围较小所以用这样的方式能够搞,只是也是挺不好想的. 我们定义cost(i,j)表示从第i天走到第j天运用同一种方式的最小花费,然后因为数据 ...

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

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

  3. BZOJ 1003 [ZJOI2006]物流运输trans

    1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4242  Solved: 1765[Submit] ...

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

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

  5. 【BZOJ1003】1003: [ZJOI2006]物流运输trans SPFA+DP

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

  6. BZOJ 1003: [ZJOI2006]物流运输(spfa+dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1003 题意: 思路: 首先用spfa计算一下任意两天之内的最短路,dis[a][b]表示的就是在第a ...

  7. bzoj 1003: [ZJOI2006]物流运输【spfa+dp】

    预处理出ans[i][j]为i到j时间的最短路,设f[i]为到i时间的最小代价,转移显然就是 f[i]=min(f[j-1]+ans[j][i]*(i-j+1)+k); #include<ios ...

  8. BZOJ 1003 ZJOI2006 物流运输trans 动态规划+SPFA

    标题效果:给定一个无向图.输送n日,有一天的某一时刻不能去,更换行考虑k,求总成本 一阶cost[i][j]用于第一i为了天j天正在同一航线的最低消费 这种利用SPFA处理 然后就是移动的法规问题 订 ...

  9. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: ...

随机推荐

  1. 给idea配置默认的java jdk

    1. 2. 3.选择安装的jdk的路径. 4.

  2. [HZNUOJ] 使用Excel + Word 批量制作准考证

    一般程序设计考试或者ACM比赛都会使用临时账号登录,这时候就需要批量制作密码条 首先需要用Excel 存储队伍的信息 比如像这样分门别类的放好 然后在word 中制作好密码条样式 选择邮件->开 ...

  3. JS 原生JS 判断滚动条滑动到底部(兼容苹果safari)

    ListenerScoller () { var pageIndex = 1; var startX, startY; document.addEventListener('touchstart',f ...

  4. Method Swizzling 剖析

    一.背景介绍 关于Method Swizzling的文章一大堆,讲的非常好的也数不胜数.不过,很多人只是会用,知道一些注意点.深入一点问的话,估计就答得不好.归其原因就是对Method Swizzli ...

  5. JS正则表达式从入门到入土(9)—— test方法以及它的那些坑

    test方法 test方法介绍 RegExp.prototype.test(str) test方法用于测试字符串参数中是否存在匹配正则表达式模式的字符串 test方法的使用 let reg = /\w ...

  6. FFmpeg 入门(3):播放音频

    本文转自:FFmpeg 入门(3):播放音频 | www.samirchen.com 音频 SDL 提供了播放音频的方法.SDL_OpenAudio 函数用来让设备播放音频,它需要我们传入一个包含了所 ...

  7. HBuilder android 打包指南(V客学院技术分享)

    前提:确保配置文件(manifest.json)已配置完,没有异常. 打包选项如下: Android 包名 :在Android系统中是判断一个App的唯一标识,不同的App可以有同样的名字,但是它的包 ...

  8. awk循环语句-【AWK学习之旅】

      AWK中两种循环语句:if-else 和 while   控制流语句: 1.if-else 求总数,平均值: [root@monitor awkdir]# awk '$3>6 {n = n ...

  9. 20145216史婧瑶《Java程序设计》第四次实验报告

    实验四 Android环境搭建 实验内容 搭建Android环境 运行Android 修改代码,能输出学号 实验步骤 1.搭建Android环境 2.安装Android,核心是配置JDK.SDK 3. ...

  10. LeetCode (65):Same tree

    Total Accepted: 83663 Total Submissions: 200541 Difficulty: Easy Given two binary trees, write a fun ...