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 }