zoukankan      html  css  js  c++  java
  • P1772 [ZJOI2006]物流运输[DP+最短路]

    题目描述

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

    解析

    看到求最优解,不难想到dp。

    我们把每天当作dp的阶段,走哪条路为dp的状态,当前换不换路线作为决策。对于每个状态的求解,我们跑最短路就行了。而对于决策,容易发现每次我们换一条路线走时,我们都会走新的这条路线至少1天。换言之,我们在从第(i)天的状态转移到第(j)天的状态时((j>i)),不妨假设(isim j)天我们走的都是同一条路,这条路就是这些天中能走的点构成的最短路。而这些天中,有些点是不能走的,我们打标记就好。

    (l)为第(isim j)天可走的最短路长度,于是有状态转移方程:

    [dp[i]=min(dp[i],dp[j-1]+(i-j+1)*l+k) ]

    参考代码

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<ctime>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<set>
    #include<map>
    #define N 401
    #define INF 0x3f3f3f3f
    using namespace std;
    inline int read()
    {
    	int f=1,x=0;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    struct rec{
    	int next,ver,edge;
    }g[N];
    int head[N],tot,n,m,e,k,d[N],dp[N];
    bool v[N],vis[N][N];
    inline void add(int x,int y,int val)
    {
    	g[++tot].ver=y,g[tot].edge=val;
    	g[tot].next=head[x],head[x]=tot;
    }
    inline int dijkstra(int l,int r)
    {
    	memset(v,0,sizeof(v));
    	memset(d,0x3f,sizeof(d));
    	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
    	d[1]=0;
    	q.push(make_pair(0,1));
    	for(int i=l;i<=r;++i)
    		for(int j=1;j<=m;++j)
    			if(vis[j][i]) v[j]=1;
    	while(q.size()){
    		int x=q.top().second;q.pop();
    		if(v[x]) continue;
    		v[x]=1;
    		for(int i=head[x];i;i=g[i].next){
    			int y=g[i].ver,z=g[i].edge;
    			if(d[y]>d[x]+z){
    				d[y]=d[x]+z;
    				q.push(make_pair(d[y],y));
    			}
    		}
    	}
    	return d[m];
    }
    int main()
    {
    	int p;
    	n=read(),m=read(),k=read(),e=read();
    	for(int i=1;i<=e;++i){
    		int u,v,val;
    		u=read(),v=read(),val=read();
    		add(u,v,val),add(v,u,val);
    	}
    	p=read();
    	for(int i=1;i<=p;++i){
    		int x,l,r;
    		x=read(),l=read(),r=read();
    		for(int j=l;j<=r;++j)
    			vis[x][j]=1;
    	}
    	for(int i=1;i<=n;++i){
    		dp[i]=dijkstra(1,i);
    		if(dp[i]!=INF) dp[i]=dp[i]*i;
    		for(int j=1;j<=i;++j){
    			int l=dijkstra(j,i);
    			if(l==INF) continue;
    			dp[i]=min(dp[i],dp[j-1]+(i-j+1)*l+k);
    		}
    	}
    	printf("%d
    ",dp[n]);
    	return 0;
    }
    
  • 相关阅读:
    【从小白到专家】收官!Istio技术实践之九:路由控制与灰度发布
    Kube-OVN 1.2.0发布,携手社区成员打造高性能容器网络
    Kubernetes最佳实践之腾讯云TKE 集群组建
    5大最新云原生镜像构建工具全解析,3个来自Google,你了解几个?
    【从小白到专家】 Istio专题之七:30分钟讲透Istio访问与控制
    后疫情时期传统企业的云原生之路将走向何方?第二期(2019-2020)云原生实践调研报告发布!
    使用Spring Security控制会话
    Spring Security – security none, filters none, access permitAll
    No bean named 'springSecurityFilterChain' is defined
    Unable to locate Spring NamespaceHandler for XML schema namespace
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11567727.html
Copyright © 2011-2022 走看看