單源最短路 SPFA(poj2387)

2021-07-07 11:04:31 字數 944 閱讀 2905

1.用鄰接表存圖

用u[i],v[i],w[i]陣列表示第i條邊是從點u[i]到v[i],路徑長度是w[i];

用first[i]陣列存頂點i的第一條邊的編號;

用next[i]陣列存第i條邊的下一條邊的編號;

2.用dis[i]陣列表示從源點到i點的最短路徑;

3.用book[i]陣列標記點i是否在佇列中;

spfa演算法步驟:

1.初始時將源點加入佇列

2.每次從隊首取出乙個頂點,對這個頂點的所有出邊進行鬆弛操作,若鬆弛成功,這個出邊指向的頂點入隊,對當前頂點處理完後出隊

3.重複第2步直到隊列為空

演算法複雜度:最壞o(n*m)

#include 

using

namespace

std;

int u[4005],v[4005],w[4005]; //鄰接表存圖

int first[1005]; //點i的第一條邊的編號

int ne[4005]; // 邊i的下一條邊

int dis[1005],book[1005];

int que[9999999],head = 1,tail = 1; //定義佇列並初始化

int inf = 99999999;

int main()

//讀入邊,建立鄰接表

for (int i =1; i <= 2*t; i++)

//1號頂點入隊

que[tail] = 1;

tail++;

book[1] = 1;

while (head//佇列不為空時迴圈

}k = ne[k];

}book[que[head]] = 0;

head++;

}cout

0;}

單源最短路

題目描述 給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出n行,每行n個用空格分隔的整數,其中第i個整數表示從點s出發...

單源最短路

恢復內容開始 dijkstra spfa floyd多源變單源 熱浪 模板題 使用spfa過 spfa 從佇列中取出點進行鬆弛操作 使用st記錄點是否還在佇列中 如果這個點本來就存在佇列中那麼就重複加入點了void spfa int s 信使 廣播式求時間 求廣播所有點的最短時間 每個點接受到向他的...

多源最短路和單源最短路

多源最短路 例題 usaco08open clear and present danger s 單源最短路例題 dijkstra求最短路 i 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第...