BZOJ1003 物流運輸 (DP spfa)

2021-07-30 04:06:42 字數 1406 閱讀 5205

給出m個點e條帶權邊,在n天內每天從1到n走一遍,邊權即為代價,每次更換線路需要k點代價,問最小的代價。

考慮到資料範圍很小,可以先預處理出所有時間區間內的從1到n的最短路的長度dis[i][j],然後進行dp。

初始狀態: f[i][j]=dis[i][j]

dp方程為: f[i][j]=min(f[i][k-1]+f[k][j]+k) (i

#include 

#include

#include

using

namespace

std;

const

int maxn=25, maxl=105;

int tim,n,k,m;

bool occ[maxl][maxl][maxn];

int tot=0,head[maxn];

struct edge

edge(int x,int y,int v,int nx):from(x),to(y),val(v),next(nx) {}

}eage[maxn*maxn];

void add(int x,int y,int val)

const

long

long inf=(1ll<<52);

long

long dis[maxl][maxl][maxn];

bool used[maxn];

queue

que;

void spfa(long

long *dis,bool *occ) }}

return;

}long

long f[maxn][maxn];

int main()

int p;

scanf("%d",&p);

for(int t=0;tint id,l,r;

scanf("%d%d%d",&id,&l,&r);

for(int i=1;i<=tim;i++)

for(int j=i;j<=tim;j++) if((l>=i && l<=j) || (r>=i && r<=j))

occ[i][j][id]=true;

}for(int i=1;i<=tim;i++)

for(int j=i;j<=tim;j++)

spfa(dis[i][j],occ[i][j]);

for(int i=1;i<=tim;i++)

f[i][i]=dis[i][i][n];

for(int len=2;len<=tim;len++)

for(int i=1;i+len-1

<=tim;i++)

printf("%lld\n",f[1][tim]);

return

0;}

bzoj1003物流運輸

物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉 停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種 因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但...

bzoj 1003 物流運輸

description 物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉 停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種 因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨...

bzoj 1003 物流運輸

我用的是dijkstra dp 當然是參考大佬們的啦 dijkstra用來進行預處理,處理出dis start time end time start time,end time 時間段的1 m的最短路,其實很簡單,我們首先要把在某個時間段不能裝卸貨物的碼頭給預處理出來,可以用字首和來處理,具體看 ...