zoukankan      html  css  js  c++  java
  • 最短路算法 -- SPFA模板

    一、算法步骤

    建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为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
    ", dist[n]);
    45 }

    三、模板题

    1、hdoj2544

  • 相关阅读:
    团队站立会议09
    团队站立会议08
    团队绩效
    团队站立会议07
    团队站立会议06
    团队站立会议05
    团队站立会议04
    团队站立会议03
    团队站立会议02
    反转链表
  • 原文地址:https://www.cnblogs.com/sench/p/7979450.html
Copyright © 2011-2022 走看看