洛谷 P1772 ZJOI2006 物流運輸

2022-07-08 21:30:17 字數 1341 閱讀 2958

除錯了好久的題..原因是因為題目裡沒有給\(e\)的取值範圍,我憑藉主觀臆斷把範圍寫成了\(200\),但其實通過理性分析可以分析出\(e\)的範圍最大應該是在這一張圖是完全圖時,為\(400\)...

題目描述:

p1772 [zjoi2006]物流運輸

題目分析

此題將\(dp\)和最短路結合到了一起,是一道不錯的題目.

先令\(dp[i]\)來表示前\(i\)天所需要的最小花費,那麼可以想出這樣乙個轉移方程

\[dp[i]=min(dp[j]+(i-j)*con[j+1][i]+k) j\in

\]解釋一下這個方程,就是我們選擇在第\(j+1\)天時切換路線,並且在\(j+1\)到\(i\)天都走這一條路線,然後加上切換路線所用的\(k\)

那麼如何保證中間走的每一條路線都是當前狀況下最優的呢?就可以想到最短路演算法了.

對於\(x\)到\(y\)天,我們先預處理一下在這段時間裡哪些點是不能走的,然後跑一邊最短路,將結果存在\(con[x][y]\)裡面,來表示\(x\)到\(y\)天裡都走一條路徑的情況下,這條路徑的最小值.

在\(dp\)過程中應將初值賦為\(con[1][i]*i\).

**

#include using namespace std;

typedef long long ll;

const int m = 410, inf = 1e8;

int n, m, k, e, d;

int h[m], e[m], w[m], ne[m], idx, dis[m];

bool judge[m][m], vis[m], cant[m]; //judge[i][j]表示i碼頭在第j天能不能走

ll dp[m]; //dp[i]表示前i天的最小花費

ll con[m][m];

//con[i][j]表示第i天到第j天都走同一條最短路的花費

void add(int a, int b, int c)

void spfa() }}

}}int main()

scanf("%d", &d);

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

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

for (int j = 1; j <= n; j++)

memset(dp, 0x7f, sizeof(dp));

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

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

}

洛谷P1772 ZJOI2006 物流運輸

這道題是相當的火,但是在tyher的講解下我一遍就ac了!part 1 理解題目 從第一天到最後一天,總會有一些點莫名其妙地走不了,所以導致我們不能按照上一次的最短路一直運輸得到最少費用,而需要不停地更換航線來保證可以運到終點,答案就是在這些方案中選出運輸費用最少的。part 2 思想過程 首先會想...

洛谷P1772 ZJOI2006 物流運輸 題解

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

P1772 ZJOI2006 物流運輸

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