演算法思想:
實現方法:
建立乙個佇列,初始時佇列裡只有起始點,再建立乙個**記錄起始點到所有點的最短路徑(該**的初始值要賦為極大值,該點到他本身的路徑賦為0)。然後執行鬆弛操作,用佇列裡有的點作為起始點去重新整理到所有點的最短路,如果重新整理成功且被重新整理點不在佇列中則把該點加入到佇列最後。重複執行直到隊列為空。
第一種用鄰接表實現
#include #include #include using namespace std;
const int in = (1<<28);
int n,m,s,t;
struct node
;vector g[100005];
int dist[100005];
int visited[100005];
queue q;
void spfa()
memset(visited, 0, sizeof(visited));
visited[s] = 1;
q.push(s);
while( !q.empty() )}}
}}int main()
spfa();
cout << dist[t] << endl;
return 0;
}die
第二種用鄰接矩陣實現
#include #include #include using namespace std;
const int in = (1<<28);
int n,m,s,t;
int g[1005][1005];
int b[1005][1005];
int dist[1005];
int visited[1005];
queue q;
void spfa()
memset(visited, 0, sizeof(visited));
visited[s] = 1;
q.push(s);
while( !q.empty() )}}
}}int main()
}while( m-- )
}spfa();
cout << dist[t] << endl;
return 0;
}
單源負邊最短路演算法 Spfa
求單源最短路的spfa演算法的全稱是 shortest path faster algorithm。很多時候,給定的圖存在負權邊,這時類似dijkstra等演算法便沒有了用武之地,而bellman ford演算法的複雜度又過高,spfa演算法便派上用場了。有人稱spfa演算法是最短路的萬能演算法。簡...
最短路專題 spfa求負權迴路
題目大意 農夫約翰在探索他的許多農場,發現了一些驚人的蟲洞。蟲洞是很奇特的,因為它是乙個單向通道,可讓你進入蟲洞的前達到目的地!他的n 1 n 500 個農場被編號為1 n,之間有m 1 m 2500 條路徑,w 1 w 200 個蟲洞。作為乙個狂熱的時間旅行fj的愛好者,他要做到以下幾點 開始在乙...
Bellman Ford演算法 解決負權邊
dijkstra演算法雖然好,但是它不能解決帶有負權邊 邊的權值為負數 的圖。接下來學習一種無論在思想上還是在 實現上都可以稱為完美的最短路徑演算法 bellman ford演算法。bellman ford演算法非常簡單,核心 四行,可以完美的解決帶有負權邊的圖。for k 1 k n 1 k 外迴...