生活随笔
收集整理的這篇文章主要介紹了
spfa_队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
spfa:
1.當給定的圖存在負權邊時,Dijkstra等算法便沒有了用武之地,而Bellman-Ford算法的復雜度又過高,SPFA算法便派上用場了.
2.我們約定有向加權圖G不存在負權回路,即最短路徑一定存在
3.思路:
用數組d記錄每個結點的最短路徑估計值,而且用鄰接表來存儲圖G。我們采取的方法是動態逼近法:設立一個先進先出的隊列用來保存待優化的結點,優化時每次取出隊首結點u,并且用u點當前的最短路徑估計值對離開u點所指向的結點v進行松弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的隊列中,就將v點放入隊尾。這樣不斷從隊列中取出結點來進行松弛操作,直至隊列空為止。
4.實現方法:
建立一個隊列,初始時隊列里只有起始點,在建立一個表格記錄起始點到所有點的最短路徑(該表格的初始值要賦為極大值,該點到他本身的路徑賦為0)。然后執行松弛操作,用隊列里有的點去刷新起始點到所有點的最短路,如果刷新成功且被刷新點不在隊列中則把該點加入到隊列最后。重復執行直到隊列為空.
代碼:
View Code 1 #include <iostream>
2 #include <memory.h>
3 #include <stdio.h>
4 #include <queue>
5 using namespace std;
6 const int maxp=
1000;
7 const int maxe=
1000;
8 const int maxnum=
1000;
9 struct edge
10 {
11 int v;
12 int w;
13 int next;
14 }edge[maxe];
15
16 typedef
struct
17 {
18 int d;
19 int pre;
20 }pp;
21 pp point[maxp];
22 int p,e;
23
24 queue<
int>
q;
25 bool use[maxp];
26
27 void Init()
28 {
29 int i;
30 for(i=
1;i<=p;i++
)
31 {
32 point[i].d=
maxnum;
33 point[i].pre=-
1;
34 }
35 int u,v,w;
36 int index=
1;
37 for(i=
1;i<=e;i++
)
38 {
39 cin>>u>>v>>
w;
40 edge[index].v=
v;
41 edge[index].w=
w;
42 edge[index].next=
point[u].pre;
43 point[u].pre=
index;
44 index++
;
45 }
46 }
47
48 void spfa(
int s)
49 {
50 memset(use,
false,
sizeof(use));
51 point[s].d=
0;
52 q.push(s);
53 use[s]=
true;
54 int t,i;
55 while(!
q.empty())
56 {
57 t=
q.front();
58 use[t]=
false;
59 q.pop();
60 for(i=point[t].pre;i!=-
1;i=
edge[i].next)
61 {
62 int v=
edge[i].v;
63 int w=
edge[i].w;
64 if(point[v].d>point[t].d+
w)
65 {
66 point[v].d=point[t].d+
w;
67 if(!
use[v])
68 {
69 q.push(v);
70 use[v]=
true;
71 }
72 }
73 }
74 }
75 }
76
77 int main()
78 {
79 cin>>p>>
e;
80 Init();
81 spfa(
1);
82 int i;
83 for(i=
1;i<=p;i++
)
84 cout<<i<<
" "<<point[i].d<<
endl;
85 return 0;
86 }
87
88 /*
89 5 10
90 1 2 10
91 1 3 5
92 2 3 2
93 2 4 1
94 3 2 3
95 3 4 9
96 3 5 2
97 4 5 4
98 5 1 7
99 5 4 6
100 */ ?5.判斷有無負環:如果某個點進入隊列的次數超過N次則存在負環 ( 存在負環則無最短路徑,如果有負環則會無限松弛,而一個帶n個點的圖至多松弛n-1次)
轉載于:https://www.cnblogs.com/pushing-my-way/archive/2012/08/05/2624271.html
總結
以上是生活随笔為你收集整理的spfa_队列的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。