dij最短路 變形

2021-07-11 19:51:09 字數 1386 閱讀 6029

時間限制

200 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者

陳越

作為乙個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助**給你的時候,你的任務是帶領你的救援隊盡快趕往事發地,同時,一路上召集盡可能多的救援隊。

輸入格式:

輸入第一行給出4個正整數n、m、s、d,其中n(2<=n<=500)是城市的個數,順便假設城市的編號為0~(n-1);m是快速道路的條數;s是出發地的城市編號;d是目的地的城市編號。第二行給出n個正整數,其中第i個數是第i個城市的救援隊的數目,數字間以空格分隔。隨後的m行中,每行給出一條快速道路的資訊,分別是:城市1、城市2、快速道路的長度,中間用空格分開,數字均為整數且不超過500。輸入保證救援可行且最優解唯一。

輸出格式:

第一行輸出不同的最短路徑的條數和能夠召集的最多的救援隊數量。第二行輸出從s到d的路徑中經過的城市編號。數字間以空格分隔,輸出首尾不能有多餘空格。

輸入樣例:

4 5 0 3

20 30 40 10

0 1 1

1 3 2

0 3 3

0 2 2

2 3 2

輸出樣例:
2 60

0 1 3#include#define inf 0x3f3f3f3f

using namespace std;

int n,m,s,d;

int a[1000];

int vis[1000];

int ma[1000][1000];

int dis[1000]; ///最短路

int pre[1000]; ///記錄路徑

int sum[1000]; ///最短路徑的價值

int cnt[1000]; ///儲存出現了幾種最短徑

void path(int t)

void dij()

else if(dis[j] == dis[k] + ma[k][j])}}

}}

printf("%d %d\n",cnt[d],sum[d]);

path(d);

printf("%d\n",d);

}int main()

dij();

return 0;

}

變形最短路

有沒有感覺神似 acmer的出行計畫 我們知道dijkstra是貪心策略的dp嘛,貪心的是距離 然而有時除了距離還有別的限制,在這裡是油。這時候花費最小不一定是最優,還要考慮剩餘的油 dp i,j 表示到i點時剩餘j油時最少的花費 在乙個點可以選擇向下走 油夠的情況 或者加1份油 多次加乙份油就相當...

dij最短路 堆優化

dij乙個主要思路,將所有點分為兩個集合s,t,初始集合s中只包含了起點,t集合包含所有點,要做的就是從t集合中不斷選取與s集合中的點距離最短的並且未被加入s集合中的點,將這個點加入s集合,並用這個點去更新所有與這個點相鄰的點,重複操作直到所有點都被加入s集合中。下面看一下dij的過程 dij演算法...

Arbitrage(最短路變形)

能否套利 sample input 3usdollar britishpound frenchfranc 3usdollar 0.5 britishpound britishpound 10.0 frenchfranc frenchfranc 0.21 usdollar 3usdollar brit...