利用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#includeusing
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。輸...