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 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    Objective-C Runtime 运行时之四:Method Swizzling
    App启动加载广告页面思路
    关于CoreData和SQLite多线程访问时的线程安全问题
    HIVE学习(待更新)
    流处理环境搭建
    CAJ2PDF
    ArcMap加载在线地图
    学习opencv(持续更新)
    风险和策略(待更新)
    区块链入门教程(转)
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11338862.html
Copyright © 2011-2022 走看看