這道題的思路應該為$dp$+最短路。
狀態設計:
$g[i][j]$表示從第$i$時刻(注意,是時刻)到第$j$時刻過程中不改變路線時的最優解。顯然,是將在這期間內所有要關閉的港口從圖中刪除,然後求最短路。最後乘上$j-i$即可。
$f[i]$表示第$i$時刻的最優解。
狀態轉移:設之前的第$j$時刻,從第$j$時刻轉移到第$i$時刻,要取$f[j]+g[j][i]+k$的最小值。
所以這題得解,時間複雜度為$o(n^2mlogm)$,鑑於本題$n \leq 100$、$m \leq 20$,該複雜度無壓力。
1 #include 23using
namespace
std;45
#define rep(i, a, b) for (register int i = a; i <= b; ++i)
6#define minn(a, b) a = min(a, b);
7#define ll long long
89 inline int
read()
1516
const
int maxn = 20 + 5, maxm = 100 + 5;17
18struct
edge ;
2122
struct
node
27};
2829
intn, m, k, e, d, ban[maxn], b[maxm][maxm];
30ll f[maxm], g[maxm][maxm];
3132 priority_queueq, empty;
3334
struct
graph
44void add(int u, int v, int
w) ;
46 g[u] =m;47}
48int
dijkstra() );
53 dis[1] = 0;54
while (!q.empty()) );63}
64}65}
66return
dis[n];67}
68} g;
6970
intmain()
7980 memset(b, 0, sizeof
(b));
8182 d =read();
83 rep(i, 1
, d)
8788 rep(i, 0
, n) 94}
9596 memset(f, 0x3f, sizeof
(f));
97 f[0] = -k;
98 rep(i, 1
, n)
99 rep(j, 0, i-1
)100 minn(f[i], f[j] + g[j][i] +k);
101 f[0] = 0
;102
103 printf("
%lld
", f[n]);
104105
return0;
106 }
ZJOI2006 物流運輸
description 物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能...
ZJOI2006 物流運輸
dp套最短路。還是蒟蒻做題少。開始想的是狀壓dp。但是因為太蒻了,不會很高效地處理一些點集的最短路,弄了乙個t飛的演算法。之後看了題解才知道原來是可以用dp套最短路做的。為什麼需要dp?因為本題涉及到狀態的選擇。每一天要麼不更換線路,要麼更換。顯然這個東西是沒有辦法貪心搞的,所以只能用dp把狀態整合...
ZJOI2006 物流運輸
物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...