【PAT甲级】1003 Emergency (25 分)(SPFA,DFS)

题意:n个点,m条双向边,每条边给出通过用时,每个点给出点上的人数,给出起点终点,求不同的最短路的数量以及最短路上最多能通过多少人。(N<=500)

AAAAAccepted code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int s,t;
 5 int a[507];
 6 vector<pair<int,int> >adj[507];
 7 vector<int>pre[507];
 8 vector<int>tmp_path;
 9 int ans=0;
10 int d[507];
11 bool inq[507];
12 int sum=1;
13 void SPFA(){
14     queue<int>q;
15     for(int i=0;i<n;++i)
16        d[i]=1e9;
17     d[s]=0;
18     q.push(s);
19     inq[s]=1;
20     while(!q.empty()){
21         int u=q.front();
22         q.pop();
23         inq[u]=0;
24         for(int i=0;i<adj[u].size();++i){
25             int v=adj[u][i].first;
26             int l=adj[u][i].second;
27             if(d[u]+l<d[v]){
28                 d[v]=d[u]+l;
29                 pre[v].clear();
30                 pre[v].push_back(u);
31                 if(!inq[v]){
32                     q.push(v);
33                     inq[v]=1;
34                 }
35             }
36             else if(d[u]+l==d[v])
37                 pre[v].push_back(u);
38         }
39     }
40 }
41 void DFS(int x){
42     if(x==s){
43         int tmp=0;
44         for(int i=tmp_path.size()-1;i>=0;--i){
45             int u=tmp_path[i];
46             tmp+=a[u];
47         }
48         if(tmp>ans)
49             ans=tmp;
50     }
51     else
52         sum+=pre[x].size()-1;
53     tmp_path.push_back(x);
54     for(int i=0;i<pre[x].size();++i)
55         DFS(pre[x][i]);
56     tmp_path.pop_back();
57 }
58 int main(){
59     cin>>n>>m>>s>>t;
60     for(int i=0;i<n;++i)
61         cin>>a[i];
62     for(int i=0;i<m;++i){
63         int x,y,w;
64         cin>>x>>y>>w;
65         adj[x].push_back({y,w});
66         adj[y].push_back({x,w});
67     }
68     SPFA();
69     DFS(t);
70     cout<<sum<<" "<<ans+a[s];
71     return 0;
72 }
保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/11194106.html