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條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中乙個起點和乙個終點,並找出從起點到終點的一條路線親身體驗浪...