1003: [ZJOI2006]物流运输trans

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2556  Solved: 1008
[Submit][Status]

Description

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

Input

第一行是四个整数n(1<=n<=100)、m(1<=m<=20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示每次修改运输路线所需成本。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来一行是一个整数d,后面的d行每行是三个整数P( 1 < P < m)、a、b(1 < = a < = b < = n)。表示编号为P的码头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一条从码头A到码头B的运输路线。

Output

包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。

Sample Input

5 5 10 8
1 2 1
1 3 3
1 4 2
2 3 2
2 4 4
3 4 1
3 5 2
4 5 2
4
2 2 3
3 1 1
3 3 3
4 4 5

Sample Output

Sample Output
32

HINT

前三天走1-4-5,后两天走1-3-5,这样总成本为(2+2)*3+(3+2)*2+10=32

Source

说一句题外话 Sample Output里面的第一行多了,没必要,害得我WA了一次……

分析:第一感觉是n,m都很小,如果模拟,每次取当前时间的最短路,会发现这样有反例。然后想想这么做为什么错——因为有一个转变路径的花费k,每次取最短不能保证全局最短(假设K很大,第一次的最短路是ans,次短路是ans+1,而后面n-1次的最短路都是ans+1,如果就这么直接做是ans+(ans+1)*(n-1)+k,而如果全部走第一次的次短路,就是(ans+1)*n,注意到K很大,这么直接做就错了)。于是乎问题的关键就是什么时候换路径,于是想到DP

f[i]=min(g[1][i]*i,min(f[j]+g[j+1][i]*(i-j)+k))(1<=j<i<=n)

f[i]表示前i天的最小总成本

g[x][y]表示从第x天到第Y天(包括两边)共同走的最短的一条路的长度,这个要预处理,具体操作时把对应的[x,y]下不存在的点标记掉,然后跑dijkstra+heap

g[1][i]*i表示一直都走一条最短路,即不换路

min(f[j]+g[j+1][i]*(i-j)+k)表示在j处换路

 #include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxm=,maxn=,inf=;
struct heap
{
int d,u;
bool operator < (const heap& x) const
{
return d>x.d;
}
};
priority_queue<heap> q;
struct wjmzbmr
{
int to,data;
};
vector<wjmzbmr> a[maxm+];
int n,m,k,e,cas,f[maxn+],g[maxn+][maxn+],flag[maxm+][maxn+],v[maxm+],d[maxm+];
int dijkstra(int s,int t)
{
memset(v,,sizeof(v));
for(int i=;i<=m;++i)
for(int j=s;j<=t;++j)
if(flag[i][j]==)
{
v[i]=;
break;
}
if(v[]==||v[m]==) return inf;
for(int i=;i<=m;++i) d[i]=inf;
d[]=;
q.push({,});
while(!q.empty())
{
heap x=q.top();q.pop();
if(v[x.u]==) continue;
for(int i=;i<a[x.u].size();++i)
if(v[a[x.u][i].to]==&&d[x.u]+a[x.u][i].data<d[a[x.u][i].to])
{
d[a[x.u][i].to]=d[x.u]+a[x.u][i].data;
q.push({d[a[x.u][i].to],a[x.u][i].to});
}
}
return d[m];
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&e);
for(int i=;i<=m+;++i) a[i].clear();
for(int i=;i<=e;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[x].push_back({y,z});
a[y].push_back({x,z});
}
memset(flag,,sizeof(flag));
scanf("%d",&cas);
for(int i=;i<=cas;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
for(int j=y;j<=z;++j) flag[x][j]=;
}
memset(g,,sizeof(g));
while(!q.empty()) q.pop();
for(int i=;i<=n;++i)
for(int j=i;j<=n;++j)
g[i][j]=dijkstra(i,j);
memset(f,,sizeof(f));
for(int i=;i<=n;++i)
{
f[i]=g[][i]*i;
for(int j=;j<i;++j)
f[i]=min(f[i],f[j]+g[j+][i]*(i-j)+k);
}
printf("%d",f[n]);
return ;
}

【BZOJ1003】【ZJOI2006】物流运输的更多相关文章

  1. bzoj1003 [ZJOI2006]物流运输

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6300  Solved: 2597[Submit][Stat ...

  2. bzoj1003[ZJOI2006]物流运输trans

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

  3. bzoj1003: [ZJOI2006]物流运输(DP+spfa)

    1003: [ZJOI2006]物流运输 题目:传送门 题解: 可以用spfa处理出第i天到第j都走这条路的花费,记录为cost f[i]表示前i天的最小花费:f[i]=min(f[i],f[j-1] ...

  4. BZOJ1003: [ZJOI2006] 物流运输 trans

    物流运输--看了神犇的题解,就是dp+最短路,设f[i]为1~i天的最少花费,那么 dp[i]=min(cost[1,i],min{dp[j]+cost[j+1,i]+K,1≤j<i}) 就是从 ...

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

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

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

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

  7. 2018.09.02 bzoj1003: [ZJOI2006]物流运输(dp+最短路转移)

    传送门 dp好题. 每一天要变更路线一定还是走最短路. 所以l~r天不变更路线的最优方案就是把l~r天所有不能走的点都删掉再求最短路.显然是可以dp的. 设f[i]表示第i天的最优花销.那么我们枚举在 ...

  8. 【动态规划】【spfa】【最短路】bzoj1003 [ZJOI2006]物流运输trans

    预处理cost[a][b] 表示第a天到第b天用同一条线路的成本. 具体转移看代码. #include<cstdio> #include<algorithm> #include ...

  9. [Bzoj1003][ZJOI2006]物流运输(spfa+dp)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1003 比较简单的dp,dp[i]为1-i天最小费用,dp方程为dp[i] = min(d ...

  10. 【bzoj1003】[ZJOI2006]物流运输

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6331  Solved: 2610[Submit][Stat ...

随机推荐

  1. win8.1 user profile service 服务登录失败

    在Win 8.1 上新建个用户后,不能登录. 出现 user profile service 服务登录失败. 无法加载用户配置文件. 网上大部分相同提示的问题是有关已有账号不能再次登陆的. 解决方式是 ...

  2. Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法

    Validation failed for one or more entities. See ‘EntityValidationErrors’解决方法 You can extract all the ...

  3. Python基础之生成器

    1.生成器简介 首先请确信,生成器就是一种迭代器.生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中.另外,对于生成器的特殊语法支持使得编写一个生成器比 ...

  4. linux中send函数MSG_NOSIGNAL异常消息

    最近2周在做ineedle的国舜项目扩展,需要使用socket的tcp连接向对方发送消息,当然需求很简单,只是按照对方要求发送指定格式的消息,程序结构也非常的简单,一对多的client/server模 ...

  5. 如何生成可变表头的excel

    1.实现功能: 传入一个表头和数据,将数据导入到excel中. 为了便于项目的扩展,数据传入通过泛型集合传入,获取数据时,通过反射的方式获取,这样无论你的表头是多少项,我都能很方便的生成.另外为了便于 ...

  6. spark-env.sh 配置示例

    #spark-env.sh JAVA_HOME=/home/hadoop/app/jdk1..0_60 SCALA_HOME=/home/hadoop/app/scala- SPARK_HOME=/h ...

  7. [转]net中哈希表的使用 Hashtable

    本文转自:http://www.cnblogs.com/gsk99/archive/2011/08/28/2155988.html 以下是PetShop中DBHelper中的使用过程: //创建哈希表 ...

  8. 《2016ThoughtWorks技术雷达峰会----js爆炸下的技术选型》

    JS爆炸下的技术选型  刘尚奇    ThoughtWorks, 高级咨询师 JS每6个星期出现一个新框架,那么如何进行JS的选型.以下从四个方面来分析. 1.工具 NPM for all the t ...

  9. [转]阿里云配置mysql远程连接

    默认是不能用客户端远程连接的,阿里云提供的help.docx里面做了设置说明,mysql密码默认存放在/alidata/account.log 首先登录: mysql -u root -h local ...

  10. Student学生管理系统

    1.定义各个层 2.添加各个层之间的引用 DAL 层调用Model BLL层调用DAL和Model UI层调用BLL和Model层 Model层供各个层调用 3.根据数据库建立实体类,每张表对应一个实 ...