• PAT1003 Emergency


    题目描述

    题意说明

    输入: 

    (1)第一行输入城市数量N、道路数量M、救援起点、救援终点。

    (2)第二行输入这N个城市分别具有的救援物资数量,可以看成是城市点自带的权重。(救援队每经过一个城市,可以携带上这个城市的救援物资)

    (3)下面M行,分别记录M条道路的起点城市、终点城市和路程。

    输出:

    (1)最短路径共有几条

    (2)在最短路径中的,最大救援物资数量的值

    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define INF 99999 
     4 
     5 int main()
     6 {
     7     int n,m,c1,c2;
     8     cin>>n>>m>>c1>>c2;
     9     vector< vector<int> > dis(n,vector<int>(n,INF)); //初始化路都不通
    10     vector<int> v(n,0); //救援队数量(即路的权重) 
    11     for(int i=0; i<n; i++)
    12     {
    13         cin>>v[i];
    14     }
    15     for(int i=0; i<m; i++)
    16     {
    17         int a,b,c;
    18         cin>>a>>b>>c;
    19         dis[a][b] = dis[b][a] = c;
    20     }
    21     
    22     vector<int> index(n,1); //标记已遍历的点
    23     vector<int> w(n,0); //用来更新权重
    24     vector<int> num(n,0); //用来保存最优路径数量
    25     vector<int> D(n,INF);
    26     D[c1] = 0;
    27     w[c1] = v[c1];
    28     num[c1] = 1;
    29     
    30     for(int i=0; i<n; i++)
    31     {
    32         //先找出发点去往下一个最近的点
    33         int p=-1;
    34         int minD=INF;
    35         for(int j=0; j<n; j++)
    36         {
    37             if(index[j] && minD>D[j])
    38             {
    39                 p = j;
    40                 minD = D[j];
    41             }
    42         }
    43         if(p == -1) break; //遍历完毕
    44         index[p] = false; //已经遍历过了
    45         //那就去遍历点P能去往的点
    46         for(int j=0; j<n; j++)
    47         {
    48             //更新start->j的距离
    49             if(index[j] && D[j]>D[p]+dis[p][j])
    50             {
    51                 D[j] = D[p]+dis[p][j];
    52                 num[j] = num[p];
    53                 w[j] = w[p]+v[j];
    54             }
    55             else if(index[j] && D[j]==D[p]+dis[p][j]) //出现相同路径 
    56             {
    57                 num[j] += num[p]; //叠加最优路径数量 
    58                 w[j] = w[j]>(w[p]+v[j]) ? w[j] : (w[p]+v[j]); //选择权重更大的新路 
    59             }
    60         } 
    61     }
    62     cout<<num[c2]<<" "<<w[c2]<<endl;
    63     
    64     return 0;
    65 } 
  • 相关阅读:
    联赛膜你测试20 T1 Simple 题解 && NOIP2017 小凯的疑惑 题解(赛瓦维斯特定理)
    P5518
    快速除法 / 取模
    P6860
    spoj LCMSUM
    虚树 学习笔记
    长链剖分 学习笔记
    CF526G
    P4292
    01 分数规划(water)
  • 原文地址:https://www.cnblogs.com/zhenxinruoshui/p/13184120.html
Copyright © 2020-2023  润新知