题目链接

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. jenkins SSH登录 Git配置(通过eclipse生成SSH 密钥)

    1.通过eclipse生成SSH 密钥 菜单栏的windows-->preferences-->General-->Network Connections-->SSH2--&g ...

  2. Andriod实现推送的解决方案(转)

    Andriod上实现消息推送的一般解决策略 第一种解决方案:C2DM云端推送功能 在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,该服务 ...

  3. webpack.dev.conf.js详解

    转载自:https://www.cnblogs.com/ye-hcj/p/7087205.html webpack.dev.conf.js详解 //引入当前目录下的utils.js文件模块var ut ...

  4. unity手势插件《FingerGestures 》使用入门

    什么是FingerGestures? FingerGestures是Unity上,非常热门的一款用于处理用户输入的插件 为什么要使用FingerGestures? 1:它统一了鼠标点击和用户触摸的输入 ...

  5. SpringMVC项目配置

    一.创建一个maven项目 1.new一个maven项目,选择next,如图:

  6. zookeeper No route to host

    2017-10-12 07:25:59,270 [myid:1] - WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@36 ...

  7. JavScript 日期格式化

    JavScript 日期格式化 //日期格式化 function formatDate(date,fmt) { if(date == null || typeof (date) == undefine ...

  8. Linux安全基线检查脚本

    基线检查内容: 一:共享账号检查 配置名称:用户账号分配检查,避免共享账号存在配置要求:1.系统需按照实际用户分配账号; 2.避免不同用户间共享账号,避免用户账号和服务器间通信使用的账号共享.操作指南 ...

  9. VisualStudio下如何编译和使用最新版本的OpenCV(修正版)

    OpenCV是托管于GitHub的开源项目,本文具体解决一个问题,就是“获取最新版本的OpenCV,并且在自己的项目中使用起来"   最新版本 2017年3月31日 BY:jsxyhelu ...

  10. (java) 第二周学习总结

    在java源代码中,每个变量都必须声明一种类型(type).有两种类型:primitive type和reference type.引用类型引用对象(reference to object),而基本类 ...