1. 程式人生 > >最短路算法 -- SPFA模板

最短路算法 -- SPFA模板

const 結點 con set spf () 最短路算法 tor acm

一、算法步驟

建立一個隊列,初始時隊列裏只有起始點,再建立一個數組記錄起始點到所有點的最短路徑(該數組的初始值要賦為極大值,該點到它本身的路徑賦為0,下面的模板中該數組為dist[])。然後執行松弛操作,用隊列裏有的點作為起始點去刷新到所有點的最短路,如果刷新成功且被刷新點不在隊列中則把該點加入到隊列最後。重復執行直到隊列為空。

二、算法模板

 1 struct Edge
 2 {
 3     int s, e, dist;    //邊的起點、終點、長度
 4 
 5     Edge() {}
 6     Edge(int s, int e, int d) :s(s), e(e), dist(d) {}
7 }; 8 9 const int INF = 0x3f3f3f; 10 const int N = 100 + 10; 11 vector<Edge> v[N]; //使用鄰接表存儲圖,v[i]存儲與結點i鄰接的結點 12 int dist[N]; //存儲從起點到其余各點的最短路徑 13 int visit[N]; //存儲結點是否被訪問過 14 int n; //n為圖中結點個數 15 16 void spfa(int s) //求結點s到其余各點的最短路 17 { 18 queue<int> q; 19 memset(dist, INF, sizeof
(dist)); 20 memset(visit, 0, sizeof(visit)); 21 q.push(s); 22 visit[s] = 1; 23 dist[s] = 0; 24 25 while (!q.empty()) 26 { 27 int s = q.front(); 28 q.pop(); 29 visit[s] = 0; 30 for (int i = 0; i < v[s].size(); i++) 31 { 32 int
e = v[s][i].e; 33 if (dist[e] > dist[s] + v[s][i].dist) 34 { 35 dist[e] = dist[s] + v[s][i].dist; 36 if (visit[e] == 0) 37 { 38 visit[e] = 1; 39 q.push(e); 40 } 41 } 42 } 43 } 44 printf("%d\n", dist[n]); 45 }

三、模板題

1、hdoj2544

最短路算法 -- SPFA模板