給出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的最短路,其實很簡單,我們首先要把在某個時間段不能裝卸貨物的碼頭給預處理出來,可以用字首和來處理,具體看 ...