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

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1003

分析:

这种一段一段的显然要用dp求。

f[i]表示到第i天为止的最小花销。转移有f[i]=min{f[j-1]+cost[j][i]*(i-j+1)+k};

其中cost[i][j]表示从i到j天的最短路长度,spfa预处理出来。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 int head[30],to[1000],nxt[1000],val[1000],cnt;
 6 int n,m,k,t,inb[110][30],f[110],cost[110][110],can[30];
 7 int Q[100],l,r,dis[30],inq[30];
 8 inline void add(int u,int v,int w){
 9     to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;val[cnt]=w;
10 }
11 int spfa(int be,int en){
12     for(int i=1;i<=n;i++)can[i]=0;
13     for(int i=be;i<=en;i++)
14         for(int j=1;j<=n;j++)if(inb[i][j])
15             can[j]=1;
16     l=r=0;
17     memset(dis,0x3f,sizeof(dis));
18     dis[1]=0;Q[r++]=1;inq[1]=1;
19     while(l^r){
20         int x=Q[l++];if(l==n+10)l=0;inq[x]=0;
21         for(int i=head[x];i;i=nxt[i]){
22             if(can[to[i]])continue;
23             if(dis[to[i]]>dis[x]+val[i]){
24                 dis[to[i]]=dis[x]+val[i];
25                 if(!inq[to[i]]){
26                     inq[to[i]]=1;Q[r++]=to[i];if(r==n+10)r=0;
27                 }
28             }
29         }
30     }
31     return dis[n]>100000?-1:dis[n];
32 }
33 int main(){
34     scanf("%d%d%d%d",&t,&n,&k,&m);
35     int x,y,z;
36     for(int i=1;i<=m;i++){
37         scanf("%d%d%d",&x,&y,&z);
38         add(x,y,z);add(y,x,z);
39     }
40     int h;
41     scanf("%d",&h);
42     for(int i=1;i<=h;i++){
43         scanf("%d%d%d",&x,&y,&z);
44         if(y>z)swap(y,z);
45         for(int j=y;j<=z;j++)inb[j][x]=1;
46     }
47     for(int i=1;i<=t;i++){
48         for(int j=i;j<=t;j++){
49             cost[i][j]=spfa(i,j);
50             //printf("%d\n",cost[i][j]);
51         }
52     }
53     f[0]=0;
54     for(int i=1;i<=t;i++){
55         f[i]=1<<30;
56         for(int j=1;j<=i;j++){
57             if(cost[j][i]==-1)continue;
58             f[i]=min(f[j-1]+cost[j][i]*(i-j+1)+k,f[i]);
59         }
60         //printf("%d\n",f[i]);
61     }
62     printf("%d",f[t]-k);
63 }

原文地址:https://www.cnblogs.com/suika/p/8457057.html

时间: 2024-11-10 05:51:14

BZOJ_1003_[ZJOI2006]物流运输_最短路+dp的相关文章

bzoj 1003: [ZJOI2006]物流运输trans 最短路+dp

题目链接 1003: [ZJOI2006]物流运输trans Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5246  Solved: 2157[Submit][Status][Discuss] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无

bzoj 1003 [ZJOI2006]物流运输(最短路+dp)

[ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8973  Solved: 3839[Submit][Status][Discuss] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输

B1003 物流运输(最短路 + dp)

这个dp其实不是那么难,状态其实很好想,但是细节有少许偏差. 当时我并没有想到最短路要在dp之外写,后来看题解之后发现要预处理出来每段时间1~M的最短路,然后直接dp. 题目: Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种 因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.

spfa最短路+DP BZOJ1003 [ZJOI2006] 物流运输

1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7935  Solved: 3316[Submit][Status][Discuss] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种 因素的存在,有的时候某个码头会无法装卸货物.这时

[luogu] P1772 [ZJOI2006]物流运输(动态规划,最短路)

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

bzoj1003: [ZJOI2006]物流运输

dp+最短路.暴力枚举就可以了.O(n3logn).样例中m=n然后测样例过了.然后 54行习惯性的dis[n]然后就WA了!!!. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #de

luoguP1772 [ZJOI2006]物流运输 x

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

BZOJ 1003: [ZJOI2006]物流运输trans

二次联通门 : BZOJ 1003: [ZJOI2006]物流运输trans /* BZOJ 1003: [ZJOI2006]物流运输trans Spfa + Dp Spfa预处理出i到j天的最小花费 然后N^2 dp即可 */ #include <cstdio> #include <iostream> #include <cstring> #include <queue> #define INF 1e6 const int BUF = 12312313;

BZOJ1003 ZJOI2006物流运输trans 0&#39;

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