zoukankan      html  css  js  c++  java
  • 2013寒假ACM集训_最短路

    一、单源最短路

    1、正权

    dijkstra

    2、任意权

    2、1 bellman-ford

    2、2 spfa

    二、任意点之间最短路

    floyd

    三、最短路的应用:差分约束系统

    参考模板

    http://www.toposort.com/blog/shortest-path.html

    贴一个新的最新的 spfa模板:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <cmath>
     6 #include <queue>
     7 #include <algorithm>
     8 #include <vector>
     9 #define LL __int64
    10 const int maxm = 2e6 + 10;
    11 const int maxn = 5e5 + 10;
    12 const int INF = 1<<28;
    13 using namespace std;
    14 int cnt, head[maxn], d[maxn], vis[maxn], n, m;
    15 
    16 struct node
    17 {
    18     int v, w, next;
    19 }edge[2*maxm];
    20 
    21 void add(int u, int v, int w)
    22 {
    23     edge[cnt].v = v;
    24     edge[cnt].w = w;
    25     edge[cnt].next = head[u];
    26     head[u] = cnt++;
    27 };
    28 
    29 void spfa(int s)
    30 {
    31     queue<int>q;
    32     int i, u, v;
    33     for(i = 0; i <= n; i++)
    34         d[i] = INF;
    35     d[s] = 0;
    36 
    37     q.push(s);
    38 
    39     vis[s] = 1;
    40     while(!q.empty())
    41     {
    42         u = q.front();
    43         q.pop();
    44         vis[u] = 0;
    45         for(i = head[u]; i != -1; i = edge[i].next)
    46         {
    47             v=edge[i].v;
    48             if(d[u] + edge[i].w < d[v])
    49             {
    50                 d[v] = d[u] + edge[i].w;
    51                 if(!vis[v])
    52                 {
    53                     vis[v] = 1;
    54                     q.push(v);
    55                 }
    56             }
    57         }
    58     }
    59 };
    60 int main()
    61 {
    62     int  i;
    63     int a, b, w;
    64     int s, t;
    65     while(~scanf("%d%d", &n, &m))
    66     {
    67         cnt = 0;
    68         memset(head, -1, sizeof(head));
    69         memset(vis, 0, sizeof(vis));
    70         for(i = 0; i < m; i++)
    71         {
    72             scanf("%d%d%d", &a, &b, &w);
    73             add(a, b, w);
    74             add(b, a, w);
    75         }
    76         scanf("%d%d", &s, &t);
    77         spfa(s);
    78         printf("%d\n", d[t]);
    79     }
    80 }
  • 相关阅读:
    判断质数
    猜拳三局两胜
    输入年月日判断是这一年的哪一天
    switch case
    猜拳
    判断年月日是否正确
    老狼老狼几点了
    判断是否中奖
    平滑部署war包到tomcat-deploy.sh
    只用120行Java代码写一个自己的区块链-3挖矿算法
  • 原文地址:https://www.cnblogs.com/bfshm/p/2934835.html
Copyright © 2011-2022 走看看