zoukankan      html  css  js  c++  java
  • L2-001. 紧急救援(最短路的变形)*

    L2-001. 紧急救援

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 int const MAX = 505;
     5 int const INF = 0x3fffffff;
     6 int mp[MAX][MAX], val[MAX], path[MAX], dis[MAX], re[MAX], totval[MAX], pathnum[MAX];
     7 bool vis[MAX];
     8 int n, m, s, d;
     9 
    10 void Dijkstra(int v0)
    11 {
    12     for(int i = 0; i < n; i++)
    13         dis[i] = INF;
    14     vis[v0] = true;
    15     dis[v0] = 0;
    16     totval[v0] = val[v0];
    17     pathnum[v0] = 1;
    18     for(int i = 0; i < n; i++)
    19     {
    20         if(mp[v0][i] != INF && i != v0)
    21         {
    22             dis[i] = mp[v0][i];
    23             path[i] = v0;
    24             totval[i] = val[v0] + val[i];
    25             pathnum[i] = 1;
    26         }
    27     }
    28     for(int i = 0; i < n - 1; i++)
    29     {
    30         int mi = INF, mival = 0, u = v0;
    31         for(int j = 0; j < n; j++)
    32         {
    33             if(!vis[j] && dis[j] < mi)
    34             {
    35                 mi = dis[j];
    36                 u = j;
    37             }
    38         }
    39         vis[u] = true;
    40         for(int j = 0; j < n; j++)
    41         {
    42             if(!vis[j])
    43             {
    44                 if(dis[u] + mp[u][j] < dis[j])
    45                 {
    46                     pathnum[j] = pathnum[u];
    47                     dis[j] = dis[u] + mp[u][j];
    48                     totval[j] = totval[u] + val[j];
    49                     path[j] = u;
    50                 }
    51                 else if(dis[u] + mp[u][j] == dis[j])
    52                 {
    53                     pathnum[j] += pathnum[u];
    54                     if(totval[j] < totval[u] + val[j])
    55                     {
    56                         totval[j] = totval[u] + val[j];
    57                         path[j] = u;
    58                     }
    59                 }
    60             }
    61         }
    62     }
    63 }
    64 
    65 int main()
    66 {
    67     scanf("%d %d %d %d", &n, &m, &s, &d);
    68     for(int i = 0; i < n; i++)
    69         scanf("%d", &val[i]);
    70     for(int i = 0; i < n; i++)
    71         for(int j = 0; j < n; j++)
    72             mp[i][j] = INF;
    73     int x, y, l;
    74     for(int i = 0; i < m; i++)
    75     {
    76         scanf("%d %d %d", &x, &y, &l);
    77         mp[x][y] = min(mp[x][y], l);
    78         mp[y][x] = mp[x][y];
    79     }
    80     Dijkstra(s);
    81     int num = 0, cur = d;
    82     while(cur != s)
    83     {
    84         re[num ++] = cur;
    85         cur = path[cur];
    86     }
    87     re[num ++] = s;
    88     printf("%d %d
    ", pathnum[d], totval[d]);
    89     for(int i = num - 1; i > 0; i--)
    90         printf("%d ", re[i]);
    91     printf("%d
    ", re[0]);
    92 }   
  • 相关阅读:
    跟我学Makefile(七)
    C++单例模式
    乘法逆元及求法
    推荐几个jetbrains全家桶好用的插件,同时作为备忘
    win32 获取本机网卡信息(MAC地址,IP地址等)
    centos7 安装 mysql-python时 报错 EnvironmentError: mysql_config not found
    VS2013 中使用 CxImage 库时用Unicode编码时出现链接错误
    剑指offer-二叉搜索树的后序遍历序列
    剑指offer-顺时针打印矩阵
    剑指offer-二叉树的镜像
  • 原文地址:https://www.cnblogs.com/Annetree/p/8678333.html
Copyright © 2011-2022 走看看