zoukankan      html  css  js  c++  java
  • 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)

    题意:

    输入四个正整数C,N,S,M(c<=100,n<=500),分别表示每个自行车站的最大容量,车站个数,此次行动的终点站以及接下来的M行输入即通路。接下来输入一行N个正整数表示每个自行车站初始拥有的自行车数量,接下来输入M行每行包含三个正整数分别表示一条双向边的端点以及这条路的长度。求去往终点车站一次所经历的最短路,多条最短路则优先少带出车辆,次优先少带回车辆。(路上经过站点时需要把该站点的车辆变为最大容量的一半)

    AAAAAccepted code:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int inf = 1e9;
     4 int c,n,s,m;
     5 int a[507];//每个站初始自行车数量
     6 vector<pair<int,int> >adj[507];//邻接表
     7 int d[507];//最短路距离
     8 bool inq[507];//是否在队列中的标记
     9 vector<int>pre[507];//前驱结点数组
    10 vector<int>path,temp_path;
    11 int sent=inf,take=inf;
    12 void SPFA(){
    13     queue<int>q;
    14     for(int i=1;i<=n;++i)
    15         d[i]=inf;
    16     q.push(0);
    17     inq[0]=true;
    18     while(!q.empty()){
    19         int u=q.front();
    20         q.pop();
    21         inq[u]=false;
    22         for(int i=0;i<adj[u].size();++i){
    23             int v=adj[u][i].first;
    24             int val=adj[u][i].second;
    25             if(!v)
    26                 continue;
    27             if(d[u]+val<d[v]){
    28                 d[v]=d[u]+val;
    29                 pre[v].clear();
    30                 pre[v].push_back(u);
    31                 if(!inq[v]){
    32                     q.push(v);
    33                     inq[v]=true;
    34                 }
    35             }
    36             else if(d[u]+val==d[v])
    37                 pre[v].push_back(u);
    38         }
    39     }
    40 }
    41 void DFS(int x){
    42     if(!x){
    43         int remain=0,temp_sent=0;
    44         temp_path.push_back(x);
    45         for(int i=temp_path.size()-2;i>=0;--i){
    46             int u=temp_path[i];
    47             remain+=a[u]-c/2;
    48             if(remain<0){
    49                 temp_sent-=remain;
    50                 remain=0;
    51             }
    52         }
    53         if(temp_sent<sent){
    54             path=temp_path;
    55             sent=temp_sent;
    56             take=remain;
    57         }
    58         else if(temp_sent==sent&&remain<take){
    59             path=temp_path;
    60             take=remain;
    61         }
    62         temp_path.pop_back();
    63     }
    64     temp_path.push_back(x);
    65     for(int i=0;i<pre[x].size();++i)
    66         DFS(pre[x][i]);
    67     temp_path.pop_back();
    68 }
    69 int main(){
    70     cin>>c>>n>>s>>m;
    71     for(int i=1;i<=n;++i)
    72         cin>>a[i];
    73     int u,v,val;
    74     for(int i=1;i<=m;++i){
    75         cin>>u>>v>>val;
    76         adj[u].push_back({v,val});
    77         adj[v].push_back({u,val});
    78     }
    79     SPFA();
    80     DFS(s);
    81     cout<<sent<<" ";
    82     for(int i=path.size()-1;i>=0;--i){
    83         if(i<path.size()-1)
    84             cout<<"->";
    85         cout<<path[i];
    86     }
    87     cout<<" "<<take;
    88     return 0;
    89 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    Linux入门-ssh scp rsync
    Linux入门-samba
    Linux入门-vsftp
    Linux入门-nfs
    MySQL卸载(rpm)
    rust_3_所有权
    rust_1_入门指南与猜猜看游戏
    vscode首次ssh remote linux连不上
    vbox新装ubuntu虚拟机注意事项
    IBM Rational Rose和Start UML的c++逆向工程自动生成UML类图组件
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11338862.html
Copyright © 2011-2022 走看看