好吧。我坦白。因為題意有點很多地方不了解查了tijie
description
物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉
停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種
因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是
修改路線是一件十分麻煩的事情,會帶來額外的成本。因此物流公司希望能夠訂乙個n天的運輸計畫,使得總成本
盡可能地小。
output
包括了乙個整數表示最小的總成本。總成本=n天運輸路線長度之和+k*改變運輸路線的次數。
分析:
所以看完題解後從新分析。。。
一開始沒有想明白的是改變運輸路線的次數是什麼玩意。。總感覺有可能經過最短路的時候並沒有經過不可以經過的點所以好麻煩。。就比如樣例三天可以經過一條路線。。這怎麼辦?
但是有一點很清楚。就是要求最短路。。。
所以幾天走同一條路徑既ok又花費最少呢。。
這個很像dp模型啊。類似由上乙個有用的狀態轉移到這個狀態。
所以先把dp方程搞出來。
f[i]表示1-第i所用的成本。
f[i]=min(f[i],f[j]+temp+k); 0<=j<=i-1;
這個tmp代表著從第j+1天-第i天中間可以走的話的代價。這個用spfa搞定就ok 結果dis[m]*(i-j+1)。不然就是無窮大。
又有問題出現了。怎麼判斷能不能走呢?
利用字首和就好。記錄path[i][j]為碼頭i在第j天是否可以走,可以走為0,不能走為1 , path[i][j]+=path[i][j-1]
如果在dp時的path[v][i]-path[v][j-1]!=0就是中間有天不能走。
其實感覺這道題的精華在於dp方程。
其實很多題是分層剖析可以套出來2+個模型的。
看**嘍~
#include
#include
#include
#include
using namespace std;
//by mars_ch
int n,m,k,e,d;
struct data
e[10005
*2];
int first[1005],tot;
int dis[1005],f[1005],path[25][105],inq[105];
void add(int a,int b,int c)
int spfa(int a,int b)}}
}return dis[m]>=1061109567?dis[m]:dis[m]*(b-a+1); //乘錯。。。。。寫的是(b-a)
}int main()
for(int i=1;i<=m;i++)
}scanf("%d",&d);
for(int i=1;i<=d;i++)
} for(int i=1;i<=m;i++)
}memset(f,0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++)
}printf("%d\n",f[n]-k);
return
0;}
BZOJ1003 ZJOI 物流運輸
物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但是修...
BZOJ1003 ZJOI2006 物流運輸
time limit 10 sec memory limit 162 mb submit 6148 solved 2522 submit status discuss 物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉 停好幾個碼頭。物流公司通常會設計...
BZOJ1003 ZJOI2006 物流運輸
物流公司要把一批貨物從碼頭a運到碼頭b。由於貨物量比較大,需要n天才能運完。貨物運輸過程中一般要轉 停好幾個碼頭。物流公司通常會設計一條固定的運輸路線,以便對整個運輸過程實施嚴格的管理和跟蹤。由於各種 因素的存在,有的時候某個碼頭會無法裝卸貨物。這時候就必須修改運輸路線,讓貨物能夠按時到達目的地。但...