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。輸入格式 第...