生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯最短路(java过)spfa单源最短路算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
spfa
百度百科上spfa的思路為:動態逼近法:設立一個先進先出的隊列用來保存待優化的結點,優化時每次取出隊首結點u,并且用u點當前的最短路徑估計值對離開u點所指向的結點v進行松弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的隊列中,就將v點放入隊尾。這樣不斷從隊列中取出結點來進行松弛操作,直至隊列空為止。
俗人的解釋:用普通隊列存點,每次拋出的點如果更新了周圍鄰居的距離并且這個點不在隊列中,那么這個鄰居點被更新了的就加入隊列尾。一直到所有操作都不會改變鄰居的距離,當隊列為空時,當然,這可能要特殊處理有沒有成負環(一般不會)。
百科上兩個優化策略:
- SPFA算法有兩個優化策略SLF和LLL——SLF:Small Label First 策略,設要加入的節點是j,隊首元素為i,若dist(j)<dist(i),則將j插入隊首,否則插入隊尾; LLL:Large Label Last 策略,設隊首元素為i,隊列中所有dist值的平均值為x,若dist(i)>x則將i插入到隊尾,查找下一元素,直到找到某一i使得dist(i)<=x,則將i出隊進行松弛操作。SLF 和 LLF 在隨機數據上表現優秀,但是在正權圖上最壞情況為 O(VE),在負權圖上最壞情況為達到指數級復雜度。
藍橋杯 最短路
這題用dijkstra過不了,只能用spfa.裸的spfa。
算法訓練 最短路
時間限制:1.0s 內存限制:256.0MB
問題描述
給定一個n個頂點,m條邊的有向圖(其中某些邊權可能為負,但保證沒有負環)。請你計算從1號點到其他點的最短路(頂點從1到n編號)。
輸入格式
第一行兩個整數n, m。
接下來的m行,每行有三個整數u, v, l,表示u到v有一條長度為l的邊。
輸出格式
共n-1行,第i行表示1號點到i 1號點的最短路。
樣例輸入
3 3
1 2 -1
2 3 -1
3 1 2
樣例輸出
-1
-2
數據規模與約定
對于10%的數據,n = 2,m = 2。
對于30%的數據,n <= 5,m <= 10。
對于100%的數據,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保證從任意頂點都能到達其他所有頂點。
JAVA代碼:
package 算法訓練
;
import java
.io
.BufferedReader
;
import java
.io
.IOException
;
import java
.io
.InputStreamReader
;
import java
.io
.OutputStreamWriter
;
import java
.io
.PrintWriter
;
import java
.io
.StreamTokenizer
;
import java
.util
.ArrayDeque
;
import java
.util
.ArrayList
;
import java
.util
.List
;
import java
.util
.Queue
;
public class 最短路
{static int leng
[];public static void main(String
[] args
) throws IOException
{StreamTokenizer in
=new StreamTokenizer(new BufferedReader(new InputStreamReader(System
.in
)));PrintWriter out
= new PrintWriter(new OutputStreamWriter(System
.out
));in
.nextToken();int n
=(int)in
.nval
;in
.nextToken();int m
=(int)in
.nval
;List
<node>list
[]=new ArrayList[n
];for(int i
=0;i
<n
;i
++){list
[i
]=new ArrayList<>();}leng
=new int[n
];boolean jud
[]=new boolean[n
];for(int i
=1;i
<n
;i
++) {leng
[i
]=Integer
.MAX_VALUE
;}for(int i
=0;i
<m
;i
++){in
.nextToken();int u
=(int)in
.nval
;in
.nextToken();int v
=(int)in
.nval
;in
.nextToken();int l
=(int)in
.nval
;list
[u
-1].add(new node(v
-1, l
)); }Queue
<Integer>q1
=new ArrayDeque<Integer>();q1
.add(0);while(!q1
.isEmpty()){int x
=q1
.poll();jud
[x
]=false;for(int i
=0;i
<list
[x
].size();i
++){int index
=list
[x
].get(i
).x
;int length
=list
[x
].get(i
).leng
;if(leng
[index
]>leng
[x
]+length
){leng
[index
]=leng
[x
]+length
;if(!jud
[index
]){q1
.add(index
);jud
[index
]=true;} } }}for(int i
=1;i
<n
;i
++){out
.println(leng
[i
]);}out
.flush();}static class node{int x
;int leng
;public node(int x
,int leng
){this.x
=x
;this.leng
=leng
;}}
}
總結
以上是生活随笔為你收集整理的蓝桥杯最短路(java过)spfa单源最短路算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。