物流运输 洛谷p1772
题目描述
物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是—件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小。
输入输出格式
输入格式:
第一行是四个整数n(l≤n≤100)、m(l≤m≤20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示每次修改运输路线所需成本,e表示航线条数。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来一行是一个整数d,后面的d行每行是三个整数P(1<P<m),a,b(1≤a≤b≤n)。表示编号为P的码头从第a天到第b天无法装卸货物(含头尾)。同一个码头有可能在多个时间段内不可用。但任何时间都存在至少一条从码头A到码头B的运输路线。
输出格式:
包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。
输入输出样例
5 5 10 81 2 11 3 31 4 22 3 22 4 43 4 13 5 24 5 242 2 33 1 13 3 34 4 5
32
说明
【样例输入说明】
上图依次表示第1至第5天的情况,阴影表示不可用的码头。
【样例输出说明】
前三天走1-4-5,后两天走1-3-5,这样总成本为(2+2)*3+(3+2)*2+10=32。
_NOI导刊2010提高(01)
考虑dp,dp[i]表示前i天所需的最小花费,转移方程:
dp[i]=min{dp[j]+sum[j+1][i]*(i-j)+K) (j<i)
表示在第j天改路线,sum[j+1][i]表示从满足从第j+1天到第i天的限制条件的最短路径,预处理sum数组即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int MAXN=105,MAXM=25,INF=1000000000;
struct Edge{int v,w,next;
}e[MAXM*MAXM];
int head[MAXN],tot;
int n,m,K,E,d,P,l,r,day[MAXN];
int dis[MAXN],vis[MAXN];
int sta;
int sum[MAXN][MAXN];
int heap[2][MAXN],sz;
int dp[MAXN];
inline void add(int u,int v,int w)
{e[tot].v=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot++;
}
inline void pushup(int p)
{int fa=p>>1,a=heap[0][p],id=heap[1][p];while(fa&&heap[0][fa]>a){heap[0][p]=heap[0][fa];heap[1][p]=heap[1][fa];p=fa;fa>>=1;}heap[0][p]=a;heap[1][p]=id;
}
inline void pushdown(int p)
{int son=p<<1,a=heap[0][p],id=heap[1][p];while(son<=sz){if(son<sz&&heap[0][son]>heap[1][son+1]) son++;if(heap[0][son]>=a) break;heap[0][p]=heap[0][son];heap[1][p]=heap[1][son];p=son;son<<=1;}heap[0][p]=a;heap[1][p]=id;
}
inline void insert(int a,int id)
{heap[0][++sz]=a;heap[1][sz]=id;pushup(sz);
}
inline void Pop()
{heap[0][1]=heap[0][sz];heap[1][1]=heap[1][sz--];if(sz) pushdown(1);
}
inline void Dijkstra(int l,int r)
{int i;memset(dis,60,sizeof(dis));memset(vis,0,sizeof(vis));dis[1]=0;insert(0,1);while(sz){int u=heap[1][1];Pop();if(vis[u]) continue;vis[u]=1;for(i=head[u];~i;i=e[i].next){int v=e[i].v;if((sta>>(v-1))&1) continue;if(dis[v]>dis[u]+e[i].w){dis[v]=dis[u]+e[i].w;insert(dis[v],v);}}}
}
int main()
{ios::sync_with_stdio(false);memset(head,-1,sizeof(head));int i,j,k,u,v,w;cin>>n>>m>>K>>E;f(i,1,E){cin>>u>>v>>w;add(u,v,w);add(v,u,w);}cin>>d;f(i,1,d){cin>>P>>l>>r;f(j,l,r){day[j]|=(1<<(P-1));}}f(i,1,n){sta=0;f(j,i,n){sta|=day[j];Dijkstra(i,j);sum[i][j]=dis[m];if(sum[i][j]>INF){f(k,j+1,n) sum[i][k]=INF;break;}}}f(i,1,n){if(sum[1][i]<INF) dp[i]=sum[1][i]*i;else dp[i]=INF;f(j,1,i-1){if(sum[j+1][i]>=INF) continue;dp[i]=min(dp[i],dp[j]+sum[j+1][i]*(i-j)+K);}}cout<<dp[n]<<endl; return 0;
}
物流运输 洛谷p1772相关推荐
- 【洛谷 - P1772 】[ZJOI2006]物流运输(dp)
题干: 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理 ...
- 洛谷 P1772 [ZJOI2006]物流运输
题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...
- 【洛谷 P1772】 [ZJOI2006]物流运输(Spfa,dp)
题目链接 \(g[i][j]\)表示不走在\(i\text{~}j\)时间段中会关闭的港口(哪怕只关\(1\)天)从\(1\)到\(m\)的最短路. \(f[i]\)表示前\(i\)天的最小花费.于是 ...
- [最大生成树Kruskal/倍增LCA] 火车运输 洛谷P1967
题目描述 AA 国有 nn 座城市,编号从 11 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重 ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
- P1772 [ZJOI2006]物流运输(线性dp+最短路径)
P1772 [ZJOI2006]物流运输 题意 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头 A 运到码头 B.由于货物量比较大,需要 nnn 天才能运完.货物运输过程中一般要转 ...
- 洛谷P3237 [HNOI2014]米特运输 题解
洛谷P3237 [HNOI2014]米特运输 题解 题目链接:P3237 [HNOI2014]米特运输 题意: 这题面是真的长啊 qwq 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为 ...
- 洛谷-运输(P2094)
题目链接: 运输问题 问题分析: 初读题目,可能有点搞不懂.题目要求:二当一(两件的价格算一件),并且给出了这个价格是如何计算的.题目的关键点在:如此反复.直到只收一件商品的钱. 分析到这,是否感觉有 ...
最新文章
- weblogic 负载均衡搭建
- strlen和mb_strlen的区别
- 如何在命令行中使用jq将JSON转换为CSV
- MyBatisPlus_删除篇_入门试炼_04
- 结对编程,到底是双剑合璧还是脚趾抠地?
- guid linux 识别的分区表_Linux开机流程详解:BIOSgt;MBRgt;GRUBgt;Kernel
- 近世代数-群论基础一
- springcloud视频教程
- 黑鲨3怎么安装鸿蒙系统,黑鲨u盘重装系统步骤
- 主板后置音频接口图解_全程图解:手把手教你主板各种插针接口与机箱的接法_通信数码...
- 网络计算机干啥用,路由器干什么用?路由器功能详解【图文】
- 华为云notebook在线解压压缩包问题
- 一本书读懂大数据时代
- DGV:人类基因组结构变异数据库
- 10月10日~10月17 产品资讯
- C++中经典的垃圾回收算法
- R语言—方差分析和多重比较
- 浅谈成功运营12年的传奇2D游戏DNF(地下城与勇士)
- 大数据平台安装部署(适用虚拟机级真实服务器,亲测)
- 揭开均线系统的神秘面纱_揭开依赖注入的神秘面纱,并通过此快速介绍了解它的实际应用...