PAT-1003 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 } 

 

posted @ 2020-06-23 19:58  真歆若水  阅读(100)  评论(0编辑  收藏  举报