zoukankan      html  css  js  c++  java
  • 【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 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    网上订餐系统后台代码bug记录与解决
    vector二维数组
    力扣-树-练习题(一)
    优先队列

    并查集
    C++进制转换函数
    平衡二叉树(AVL树)定义与基本操作
    二叉查找树练习题
    树的遍历
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11194106.html
Copyright © 2011-2022 走看看