L2-001. 紧急救援

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:

第一行输出不同的最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出首尾不能有多余空格。

输入样例:

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例:

2 60
0 1 3

hint:Dijkstra找最短路,只不过在找最短路的时候还要更新一下其他的值...
一开始我写Dijkstra的时候没有加标记数组,就wa了,我自己想想感觉好像Dijkstra不需要标记数组的呀。。。问了大佬才知道要标记数组,反正我现在也还没想明白为什么要标记数组(我明明是符合
条件才会更新的啊 更新一下--在李主席的指导下,我手跑了一下自己的代码...果然发现问题了,同一个点pop多次导致了重复计数,当然如果只是求最短路径就不存在这种问题)
...先记着,以后标记就是了

  自己的手跑过程,字有点丑...但是差不多就是这个意思 -- 当一个点有多条最短路径的时候并且这个点是起点到终点的最短路径的经过点时,就会导致重复计数!


 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int INF=0x3f3f3f3f;
 4 int cure[505], d[505], num[505], frt[505], u[505], done[505];
 5 bool visit[505];
 6 priority_queue<pair<int, int> > que;
 7 vector<pair<int, int> > G[505];
 8 
 9 void Print(int x){
10     if(frt[x]==-1){
11         cout<<x;
12         return;
13     }
14     Print(frt[x]);
15     cout<<" "<<x;
16 }
17 
18 int main(){
19     int n, m, s, D;
20     cin>>n>>m>>s>>D;
21     for(int i=0; i<n; i++)    scanf("%d", &u[i]);
22     int a, b, c;
23     for(int i=0; i<m; i++){
24         cin>>a>>b>>c;
25         G[a].push_back(make_pair(b, c));
26         G[b].push_back(make_pair(a, c));
27     }
28     frt[s]=-1;
29     for(int i=0; i<n; i++){
30         d[i]=INF;
31         num[i]=0;
32         done[i]=0;
33     }
34     cure[s]=u[s];
35     num[s]=1;
36     d[s]=0;
37     que.push(make_pair(-d[s], s));
38     while(que.size()){
39         int now=que.top().second;  que.pop();
40         if(done[now]==1)    continue;
41         done[now]=1;
42         for(int i=0; i<G[now].size(); i++){
43             int v=G[now][i].first;
44             if(d[v]>d[now]+G[now][i].second){
45                 d[v]=d[now]+G[now][i].second;
46                 num[v]=num[now];
47                 cure[v]=cure[now]+u[v];
48                 frt[v]=now;
49                 que.push(make_pair(-d[v], v));
50             }else if(d[v]==d[now]+G[now][i].second){
51                 num[v]=num[v]+num[now];
52                 if(cure[now]+u[v]>cure[v]){
53                     cure[v]=cure[now]+u[v];
54                     frt[v]=now;
55                 }
56                 que.push(make_pair(-d[v], v));
57             }
58         }
59     }
60     cout<<num[D]<<" "<<cure[D]<<endl;
61     Print(D);
62     cout<<endl;    
63     return 0;
64 }
原文地址:https://www.cnblogs.com/ledoc/p/6572343.html