SPFA演算法求最短路

2022-09-01 15:18:17 字數 1180 閱讀 9839

利用spfa演算法來解決hdu1874

首先了解一下spfa的相關概念:

spfa可以處理負權邊

若給定的圖存在負權邊,類似dijkstra演算法等演算法便沒有了用武之地,spfa演算法便派上用場了。簡潔起見,我們約定加權有向圖g不存在負權迴路,即最短路徑一定存在。用陣列d記錄每個結點的最短路徑估計值,而且用鄰接表來儲存圖g。我們採取的方法是動態逼近法:設立乙個先進先出的佇列用來儲存待優化的結點,優化時每次取出隊首結點u,並且用u點當前的最短路徑估計值對離開u點所指向的結點v進行鬆弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的佇列中,就將v點放入隊尾。這樣不斷從佇列中取出結點來進行鬆弛操作,直至佇列空為止。

例題hdu1874:

題意某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。 

現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。

input本題目包含多組資料,請處理到檔案結束。 

每組資料第一行包含兩個正整數n和m(0sample output

2

-1

#include#include

using

namespace

std;

const

int inf=1000000

;const

int maxn=200+10

;int

n,m;

intmap[maxn][maxn];

intdis[maxn];

void spfa(ints);

vis[s]=true

; dis[s]=0

; queue

q;q.push(s);

while(!q.empty())}}

}}int

main()

ints,t;

scanf(

"%d%d

",&s,&t);

spfa(s);

if(dis[t]==inf)

puts("-1

");else

printf(

"%d\n

",dis[t]);

}return0;

}

spfa求最短路

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸...

spfa求最短路

題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊...

spfa求最短路

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸...