bzoj 1003物流運輸 區間dp spfa

2022-08-13 10:06:17 字數 1156 閱讀 7593

基本思路:

一開始確實沒什麼思路,因為覺得怎麼著都會超時,然後看一下資料範圍,呵,怎麼都不會超時。

思路:1.看到能改變線路,想到可以用以下區間dp,區間dp的話,先列舉長度,列舉開始位置,然後列舉中間點 dp[i][j]=min(dp[i][j],dp[i][z]+dp[z][j]+k);

2.然後每段時間最短路究竟是多少,然後因為不會超時,所以就二重迴圈列舉就好了

(ps:這裡要說明一下給自己提個醒:

spfa就是佇列優化的迪傑斯特拉,然後的話vis陣列每次出乙個就置零乙個,如果不置零是錯的

堆優化的迪傑斯特拉自己之前也加vis,而且每次出乙個的話不置零,不會錯,因為vis陣列是不必要的

所以以後寫的話一般就寫spfa好了,堆優化的迪傑斯特拉的話略難寫一點,而且兩者速度也差不多

普通的迪傑斯特拉的話還是要置零的,因為比起spfa就是優化在了佇列

**如下:

#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

const int maxn = 100+10;

int head[maxn],cnt;

struct edgeedge[maxn<<4];

ll tim[maxn][maxn],f[maxn][maxn];

bool flag[maxn][maxn],block[maxn],vis[maxn];

int dis[maxn];

int n,m,k;

void add(int u,int v,int w)

int spfa(int s,int e)}}

while(!q.empty())}}

vis[u]=false;

}return dis[m];

}void dp()}}

}int main()

int q;

scanf("%d",&q);

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

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

}dp();

cout

}

bzoj1003物流運輸

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

bzoj 1003 物流運輸

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

bzoj 1003 物流運輸

我用的是dijkstra dp 當然是參考大佬們的啦 dijkstra用來進行預處理,處理出dis start time end time start time,end time 時間段的1 m的最短路,其實很簡單,我們首先要把在某個時間段不能裝卸貨物的碼頭給預處理出來,可以用字首和來處理,具體看 ...