題意:傳送門
題解:這個題首先每個時間都有乙個最短路,也就是每天都有最短路,如果不要更換路線的話,那麼答案就是每次的最短路,但是現在更換路線有了花費,並且似乎看上去很是麻煩,但是實則並不麻煩,只需要考慮的是到了這個時間是不是應該換線,但是這樣是否太片面了呢?只考慮當天,那這樣對後面豈不是有可能將最優解丟掉,然後差點就能想出來,但是卻看了題解,是這樣的,我們用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天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...