一、算法步骤
建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为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
时间: 2024-10-14 23:49:22