• 【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 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    监控 | open-falcon | 安装
    日语 | 日本50音
    PXE | 开关机
    linux | 网卡驱动
    Linux——Centos 7 chmod命令
    Linux——Centos 7 ls命令
    Linux——Centos 7 passwd命令
    Linux——Centos 7 账户管理命令(用户组篇)groupadd groupmod groupdel
    Linux——Centos 7 账户管理命令(用户篇)useradd usermod userdel
    Linux——Centos 7 diff命令
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11338862.html
Copyright © 2020-2023  润新知