遇到小范围数据的题目就容易被限制了思维,我单知道数据小可以跑很多遍最短路,但我没想到暴力跑N ^ 2的最短路也能过

 物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转
停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种
因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是
修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本
尽可能地小。

题意

把这题全部拆开来事实上是一道好题,用cost[i][j]表示i到j这个时间段内都可以跑的最短路,然后直接n ^ 2的dp跑出来答案即可。

时间复杂度n * n * m * lnm,实际上是一个很科学很可以接受的复杂度,但是由于之前10w的题目做得太多了,这种小数据反而被限制了想象力,拆开来想这题就变成了一道综合了基础最短路,基础动态规划,基础前缀和的水题。

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
inline int read(){int now=;register char c=getchar();for(;!isdigit(c);c=getchar());
for(;isdigit(c);now=now*+c-'',c=getchar());return now;}
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
const double eps = 1e-;
const int maxn = ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,K,e;
struct Edge{
int to,next;
LL dis;
}edge[];
int head[maxn],tot;
int use[][maxn];
void init(){
Mem(head,-); tot = ;
}
void add(int u,int v,LL w){
edge[tot].to = v;edge[tot].next = head[u];
edge[tot].dis = w;head[u] = tot++;
}
LL cost[maxn][maxn];
bool vis[maxn];
LL dis[maxn];
LL dp[maxn];
struct Node{
int pos; LL dis;
Node(int pos = ,LL dis = ):pos(pos),dis(dis) {}
friend bool operator < (Node a,Node b){
return a.dis > b.dis;
}
};
LL Dijkstra(int l,int r){
for(int i = ; i <= M ; i ++){
if(use[i][r] - use[i][l - ] == ) vis[i] = ;
else vis[i] = ;
dis[i] = INF;
}
dis[] = ;
priority_queue<Node>Q; Q.push(Node(,));
while(!Q.empty()){
Node u = Q.top(); Q.pop();
if(u.dis > dis[u.pos]) continue;
for(int i = head[u.pos]; ~i ; i = edge[i].next){
int v = edge[i].to,w = edge[i].dis;
if(vis[v] && dis[v] > u.dis + w){
dis[v] = u.dis + w;
Q.push(Node(v,dis[v]));
}
}
}
if(dis[M] == INF) return INF;
return dis[M] * (r - l + );
}
int main()
{
Sca2(N,M); Sca2(K,e);
init();
For(i,,e){
int u,v,w; Sca3(u,v,w);
add(u,v,w); add(v,u,w);
}
int q;Sca(q);
while(q--){
int x,l,r; Sca3(x,l,r);
For(i,l,r) use[x][i] = ;
}
for(int i = ; i <= M ; i ++)
for(int j = ; j <= N ; j ++)
use[i][j] += use[i][j - ];
for(int i = ; i <= N ; i ++)
for(int j = i; j <= N ; j ++)
cost[i][j] = Dijkstra(i,j);
Mem(dp,0x3f);
dp[] = ;
for(int i = ; i <= N; i ++){
for(int j = ; j <= i - ; j ++){
if(cost[j + ][i] == INF) continue;
dp[i] = min(dp[i],dp[j] + cost[j + ][i] + K);
}
}
Prl(dp[N] - K);
#ifdef VSCode
system("pause");
#endif
return ;
}

bzoj1003 最短路+dp的更多相关文章

  1. bzoj1003物流运输 最短路+DP

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

  2. hdu 4568 Hunter 最短路+dp

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

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

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

  4. POJ 3635 Full Tank? 【分层图/最短路dp】

    任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  5. [USACO07NOV]牛继电器Cow Relays (最短路,DP)

    题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...

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

    思路:最短路+DP 提交:1次 题解: $f[i]$表示到第$i$天的最小代价,我们可以预先处理出$i,j$两天之间(包括$i,j$)都可通行的最短路的代价记做$s[i][j]$,然后有$f[i]=m ...

  7. L3-007 天梯地图 (30分) 最短路+dp

    最短路+dp思路:nuoyanli 520 Let's play computer game 输入样例1: 10 15 0 1 0 1 1 8 0 0 1 1 4 8 1 1 1 5 4 0 2 3 ...

  8. BZOJ1003 物流运输 最短路+DP

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

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

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

随机推荐

  1. How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1

    Bots are everywhere nowadays, and we interact with them all of the time. From interactions on our ph ...

  2. Java 设计模式 ------ 模板设计模式

    模板设计模式主要来源于生活中有一些事情是有模板可以遵循的.举两个生活中的例子,如泡茶和泡咖啡,看一看. 泡茶有以下四个步骤:  1, 烧开水;  2 把茶放到水杯中; 3,倒入开水; 4, 加糖. 泡 ...

  3. Mybatis常见问题总结

    1.大于号.小于号在sql语句中的转换 使用mybatis 时sql语句是写在xml文件中,如果sql中有一些特殊的字符的话,比如< ,<=,>,>=等符号,会引起xml格式的 ...

  4. Nginx 浏览器缓存

    L:97 一般都是 同时使用 浏览器与Nginx缓存

  5. linux-shell系列5-统计

    #!/bin/bashshow=$(service --status-all 2>/dev/null | grep -E "is running|正在运行"|awk '{pr ...

  6. eolinker——添加项目成员

    https://help.eolinker.com/account/?target=/md/workspace/team 在工作空间的主页面,而不是接口的主页面这个一定要注意,邀请方式有两种,根据自己 ...

  7. django-pure-pagination 组件使用

    django-pure-pagination 组件 用于在 django 中自动创建分页 官方详见 github : 这里 安装 pip install django-pure-pagination ...

  8. 【转】从Vue.js源码看异步更新DOM策略及nextTick

    在使用vue.js的时候,有时候因为一些特定的业务场景,不得不去操作DOM,比如这样: <template> <div> <div ref="test" ...

  9. BZOJ2244 拦截导弹

    此题最早看到是在我还什么都不会的去年的暑期集训,是V8讲的DP专题,我当时还跑去问这概率怎么做.这道题要求的是二维最长不上升子序列,加上位置一维就成了三维偏序问题,也就是套用CDQ分治,对位置排序,然 ...

  10. Typescript学习笔记(五) 模块机制

    javascript从es5之前都缺少一种模块机制,无法通过js引入文件,于是requirejs等等的加载器应运而生.这些加载器的使用也并不统一,产生了amd,commonjs,umd等等的规范,各有 ...