zoukankan      html  css  js  c++  java
  • hihoCoder#1093 最短路径·三:SPFA算法

    原题地址

    宽搜+剪枝,不是说好了适用于稀疏矩阵的嘛,怎么题目的测试数据边数达到10^6。。。不科学

    代码:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <map>
     4 
     5 using namespace std;
     6 
     7 #define MAX_POINT 100008
     8 #define MAX_EDGE 1000008
     9 
    10 int N, M, S, T;
    11 int p[MAX_POINT];
    12 int q[MAX_POINT];
    13 int d[MAX_POINT];
    14 map<int, map<int, int> > g;
    15 int head, tail;
    16 
    17 void spfa() {
    18   for (int i = 0; i < N; i++)
    19     p[i] = -1;
    20   memset(d, 1, sizeof(d));
    21   head = tail = 0;
    22   d[S] = 0;
    23   p[S] = tail;
    24   q[tail++] = S;
    25 
    26   while (head < tail) {
    27     int s = q[head++];
    28     for (auto t : g[s]) {
    29       int len = d[s] + t.second;
    30       if (len < d[t.first]) {
    31         d[t.first] = len;
    32         if (p[t.first] < 0) {
    33           p[t.first] = tail;
    34           q[tail++] = t.first;
    35         }
    36       }
    37     }
    38     p[s] = -1;
    39   }
    40 }
    41 
    42 int main() {
    43   scanf("%d%d%d%d", &N, &M, &S, &T);
    44   for (int i = 0; i < M; i++) {
    45     int a, b, len;
    46     scanf("%d%d%d", &a, &b, &len);
    47     if (!g[a][b])
    48       g[a][b] = g[b][a] = len;
    49     else
    50       g[a][b] = g[b][a] = min(g[a][b], len);
    51   }
    52 
    53   spfa();
    54 
    55   printf("%d
    ", d[T]);
    56 
    57   return 0;
    58 }
  • 相关阅读:
    第二次作业
    java第一次上机练习
    java第一次作业
    第四周上机作业
    第三周作业
    第一次上机作业
    第一次作业
    3.19第三周上机作业
    第一周课下作业
    2020.3.23 java第三次作业
  • 原文地址:https://www.cnblogs.com/boring09/p/4396507.html
Copyright © 2011-2022 走看看