ZJOI2006 物流運輸 動態規劃 最短路

2021-09-06 16:51:05 字數 1333 閱讀 5489

題意:傳送門

題解:這個題首先每個時間都有乙個最短路,也就是每天都有最短路,如果不要更換路線的話,那麼答案就是每次的最短路,但是現在更換路線有了花費,並且似乎看上去很是麻煩,但是實則並不麻煩,只需要考慮的是到了這個時間是不是應該換線,但是這樣是否太片面了呢?只考慮當天,那這樣對後面豈不是有可能將最優解丟掉,然後差點就能想出來,但是卻看了題解,是這樣的,我們用dp[i]表示到了第i天所用的最小花費,然後到了第i天,動態轉移方程就是:

dp[i]=min(dp[j-1]+cost(j,i)*(i-j+1)+k),也就是感覺這個方程差點和斜率dp的方程好像啊,但是這個cost(j,i)表示的是從第j天到第i天的最短路,我們得把這幾天都不能走的點給標記好,然後跑最短路,使用spfa,啥都可以的,之後就是注意dp[0]=-k,為啥呢,因為第一天是不算更改費,這個只是為了消去後面的影響。

注意:本題雙向邊

附上**:

#includeusing namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*t;

}const int maxn=1e2+5;

const int maxm=20+5;

const int maxe=1e3+5;

const int inf=0x3f3f3f3f;

struct edge;

edge edges[maxe];

int head[maxm],tot;

void init()

void add_edges(int u,int v,int w)

int n,m,k,e;

int u,v,w;

int d,p,a,b;

bool broken[maxm][maxn];

bool nicee[maxm];

int dp[maxn];

int dist[maxm];

//void spfa(int x)

//// }

//}bool vis[maxm];

void spfa()}}

}}int main()

}memset(dist,inf,sizeof(dist));

dist[1]=0;

// spfa(1);

spfa();

if(dist[m]==inf)

dp[i]=min(dp[i],dp[j-1]+k+dist[m]*(i-j+1));}}

printf("%d\n",dp[n]);

return 0;

}

ZJOI2006 物流運輸

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

ZJOI2006 物流運輸

dp套最短路。還是蒟蒻做題少。開始想的是狀壓dp。但是因為太蒻了,不會很高效地處理一些點集的最短路,弄了乙個t飛的演算法。之後看了題解才知道原來是可以用dp套最短路做的。為什麼需要dp?因為本題涉及到狀態的選擇。每一天要麼不更換線路,要麼更換。顯然這個東西是沒有辦法貪心搞的,所以只能用dp把狀態整合...

ZJOI2006 物流運輸

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