fzu 2261(spfa列印最短路徑,求最短路)

2021-08-07 05:17:01 字數 1177 閱讀 6209

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

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

input

包含多組測試資料。

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

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

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

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

0之前碰到過一次spfa,就跑過去學習了一下。

很多時候,給定的圖存在負權邊,這時類似dijkstra等演算法便沒有了用武之地,而bellman-ford演算法的複雜度又過高,spfa演算法便派上用場了。有人稱spfa演算法是最短路的萬能演算法。

spfa與bfs很像,但是bfs出佇列後,就永遠不可能再進來了,但是spfa中乙個點可能在出佇列之後再次被放入佇列,也就是乙個點改進過其它的點之後,過了一段時間可能本身被改進(

重新入隊

),於是再次用來改進其它的點,這樣反覆迭代下去。

具體**:

#include #include #include #include #include using namespace std;

const int n=100005;

const int inf=0x3f3f3f;

struct node

a[n];

int len=0,f[n],dist[n],vis[n];

int s[n],e[n];

int c[n];//記錄每乙個點訪問的次數

int path[n];//記錄路徑

void add_edge(int u,int v,int w)//構建以u節點為根節點的鄰接表,

void spfa(int start)}}

}}

}void printpath(int k)

{ if(path[k])

printpath(path[k]);

cout<

FZU 2261 浪裡個浪(spfa)

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

FZU 2261浪裡個浪 spfa求最短時間

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

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

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