SPFA演算法的廣度優先實現

2021-10-24 22:13:33 字數 1406 閱讀 3826

廣度優先搜尋+queue實現的spfa演算法

#include

using

namespace std;

#define mod 1e9+7

#define n 100

#define inf 0x3f3f3f3f

const

double pi =

atan

(1.0)*

4.0;

typedef

long

long ll;

int visit[n]

,dis[n]

,head[n]

;int m,n;

int x,y,z;

struct edge

e[n]

;int cnt;

void

init()

cnt=0;

}void

add(

int x,

int y,

int z)

void

spfa

(int x)}}

}}intmain()

cin>>x;

spfa

(x);

for(

int i=

1;i<=n;i++

) cout<<<

" ";

}

在乙個圖中,我們僅僅知道結點a到結點e的最短路徑長度,有時候還需要說明「怎麼走」才算真正解決了問題。

我們定義乙個path陣列,path[i]表示源點s到i的最短路程中,結點i之前的結點的編號(父結點),我們在借助結點u對結點v鬆弛的同時,標記下path[v]=u,記錄的工作就完成了。然後遞迴輸出即可。

void

printpath

(int k)

spfa演算法同樣可用於判斷負環

即設計乙個陣列判斷每乙個點的入隊次數,如果某個點的入隊次數大於等於n,則存在負環。我覺得是因為最多優化n-1次,類似於布林曼-福特演算法。

缺點:在存在負權迴路的時候,時間複雜度退化為o(mn),因為當找出第乙個入隊n次的時候,幾乎所有的點都入隊了n次,所有的點入隊一次即要便歷一次所有的邊。所有的點入隊n次即要便歷n次所有的邊,假設邊數為m,便利一次的所有的邊複雜度為o(m),總的就是o(nm).

這就需要深搜來實現spfa了。

void

dfsspfa

(int s)

d[v]

= d[s]

+w; vis[v]

=true

;dfsspfa

(v);

vis[v]

=false;}

}}

spfa和廣度優先遍歷

spfa與廣度優先遍歷很相似,都需要用到佇列,所以一起寫。1 bfs 廣度優先遍歷 從乙個起點出發,找到所有與這個點相鄰的點,將他們都放到佇列中,在依次查詢。如下 void bfs int st 2 spfa spfa其實是bellman ford的優化,bellman ford中列舉了太多沒用的邊...

python實現廣度優先演算法

參考部落格 這篇部落格的 都是基於參考部落格裡的題目和 的。bfs在這個題目中的實現思想 1.用乙個佇列q儲存待檢查的鄰居們 2.建立乙個空陣列t用於儲存已被檢查過的鄰居們 3.從這個佇列中彈出佇列頭,我們這裡暫時稱為鄰居a,檢查這位鄰居a是否是芒果銷售商,並把a加入到t中 4.如果是,那麼你找到乙...

廣度優先演算法的實現(BFS)

include include using namespace std 定義點的結構體 struct temp struct way 地圖 int a 4 5 定義乙個bool型的陣列判斷是否走過這條路 bool b 4 5 vectorv1 用來存放元素 vectorpath 用來存放路徑 int...