单源最短路径(spfa)
題目描述
如題,給出一個有向圖,請輸出從某一點出發到所有點的最短路徑長度。
輸入輸出格式
輸入格式:
第一行包含三個整數N、M、S,分別表示點的個數、有向邊的個數、出發點的編號。
接下來M行每行包含三個整數Fi、Gi、Wi,分別表示第i條有向邊的出發點、目標點和長度。
輸出格式:
一行,包含N個用空格分隔的整數,其中第i個整數表示從點S出發到點i的最短路徑長度(若S=i則最短路徑長度為0,若從點S無法到達點i,則最短路徑長度為2147483647)
輸入輸出樣例
輸入樣例#1:
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
輸出樣例#1:
0 2 4 3
說明
時空限制:1000ms,128M
數據規模:
對于20%的數據:N<=5,M<=15
對于40%的數據:N<=100,M<=10000
對于70%的數據:N<=1000,M<=100000
對于100%的數據:N<=10000,M<=500000
樣例說明:
分析
spfa+隊列優化:
dis[i]表示點s到i的最短路徑,一開始dis數組為maxlongint。
1.用隊列優化,就可以省略枚舉每個點的時間,由O(M^2)變成了O(M)。
2.跑一波spfa,然后輸出就好了。
程序:
var next,ls,s,t,w,p:array[0..500001]of longint; d:array[0..10001]of longint; v:array[0..10001]of boolean; n,m,q,i,j:longint;procedure spfa; var head,tail,i:longint; beginhead:=0;tail:=1;d[q]:=0;v[q]:=true;p[1]:=q;while head<tail dobegininc(head);i:=ls[p[head]];while i>0 dobeginif d[s[i]]+w[i]<d[t[i]] thenbegind[t[i]]:=d[s[i]]+w[i];if v[t[i]]=false thenbeginv[t[i]]:=true;inc(tail);p[tail]:=t[i];end;end;i:=next[i];end;v[p[head]]:=false;end; end;beginfillchar(next,sizeof(next),0);fillchar(ls,sizeof(ls),0);readln(n,m,q);for i:=1 to m dobeginreadln(s[i],t[i],w[i]);next[i]:=ls[s[i]];ls[s[i]]:=i;end;for i:=1 to n dobegind[i]:=maxlongint;v[i]:=false;end;spfa;for i:=1 to n dowrite(d[i],' '); end.轉載于:https://www.cnblogs.com/YYC-0304/p/9500066.html
總結
以上是生活随笔為你收集整理的单源最短路径(spfa)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排队的奶牛
- 下一篇: 最短路计数(spfa)