除錯了好久的題..原因是因為題目裡沒有給\(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天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...