I 浪裡個浪 FZU 2261 (最短路)

2021-08-20 11:01:43 字數 1607 閱讀 1997

tonyy是乙個喜歡到處浪的男人,他的夢想是帶著蘭蘭姐姐浪遍**的各個角落,不過在此之前,他需要做好規劃。

現在他的手上有乙份**地圖,上面有n個城市,m條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中乙個起點和乙個終點,並找出從起點到終點的一條路線親身體驗浪的過程。但是他時間有限,所以想選擇耗時最小的,你能告訴他最小的耗時是多少嗎?

input

包含多組測試資料。

輸入第一行包括兩個整數n和m,表示有n個地點,m條可行路徑。點的編號為1 - n。

接下來m行每行包括三個整數i, j, cost,表示從地點i到地點j需要耗時cost。

接下來一行第乙個數為s,表示可能的起點數,之後s個數,表示可能的起點。

接下來一行第乙個數為e,表示可能的終點數,之後e個數,表示可能的終點。

0輸出他需要的最短耗時。

sample input

4 4

1 3 1

1 4 2

2 3 3

2 4 4

2 1 2

2 3 4

sample output
1

題目意思為有乙個圖,圖有多個出發點和多個終點,問從出發點到終點所需的最小花費,此題有多個出發點和多個終點,且個數都比較大,是1e5的範圍,如果列舉每個出發點和終點,肯定可以求出最佳答案,但是時間我們不能承受,所以我們可以考慮加一些邊,設定乙個源點為節點0,把題目所有的出發點連到該點,且權值為0,再設定乙個匯點為節點n+1,把每個終點連上該節點,且權值也為0,所以就變成了求0節點到n+1節點的最短路了,我們跑一遍堆優化的迪傑斯特拉就可以了,也可以用spfa演算法,我用的是dijkstra。

**如下:

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

const int maxn = 1e5 + 10;

struct edg

edg(int a, int b):to(a), val(b){}

edg(){}

};vectorma[maxn];

int dist[maxn], vis[maxn];

void dijkstra(int start, int n)

priority_queueq;

dist[start] = 0;

q.push(edg(start, 0));

while(!q.empty())

vis[u] = 1;

for(int i = 0; i < ma[u].size(); ++ i)}}

}int main()

for(int i = 0; i < m; ++ i)

int s, t;

scanf("%d", &s);

for(int i = 0; i < s; ++ i)

scanf("%d", &t);

for(int i = 0; i < t; ++ i)

dijkstra(0, n);

int ans = dist[n+1];

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

}return 0;

}

FZU 2261 浪裡個浪 多源最短路

tonyy是乙個喜歡到處浪的男人,他的夢想是帶著蘭蘭姐姐浪遍 的各個角落,不過在此之前,他需要做好規劃。現在他的手上有乙份 地圖,上面有n個城市,m條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中乙個起點和乙個終點,並找出從起點到終點的一條路線親身體驗浪...

浪裡個浪 FZU 2261(最短路好題)

tonyy是乙個喜歡到處浪的男人,他的夢想是帶著蘭蘭姐姐浪遍 的各個角落,不過在此之前,他需要做好規劃。現在他的手上有乙份 地圖,上面有n個城市,m條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中乙個起點和乙個終點,並找出從起點到終點的一條路線親身體驗浪...

FZU 2261 浪裡個浪(spfa)

link tonyy是乙個喜歡到處浪的男人,他的夢想是帶著蘭蘭姐姐浪遍 的各個角落,不過在此之前,他需要做好規劃。現在他的手上有乙份 地圖,上面有n個城市,m條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中乙個起點和乙個終點,並找出從起點到終點的一條路線...