pat牛客网1001-1010_C++

1001 Public Bike Management (30)

题目大意:

每个输入文件包含一个测试用例。对于每种情况,第一行包含4个数字:C max(<= 100)(始终为偶数)是每个站点的最大容量;N(<= 500),总站数;S p,问题站点的索引(站点从1到N编号,PBMC用顶点0表示);和M,道路数。第二行包含N个非负数C i(i = 1,... N),其中每个C i分别是S i处的当前自行车数。然后是M行,每行包含3个数字:S i,S j和T ij,它们描述了在两个测站S之间移动所需的时间T iji和S j。一行中的所有数字都用空格分隔。
首先输出PBMC必须发送的自行车数量。然后在一个空格之后,以以下格式输出路径:0-> S 1- > ...-> S p。最后,在另一个空间之后,将S p的条件调整为完美后,将必须返回的自行车数量输出到PBMC 。
请注意,如果这样的路径不是唯一的,请输出需要最少数量的自行车的路径,我们必须将其带回PBMC。

输入例子:

10 3 3 5
6 7 0
0 1 1
0 2 1
0 3 3
1 3 1
2 3 1

输出示例:

3 0-> 2-> 3 0
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define N 509
int matrix[N][N]={};
int cap[N]={};
vector<vector<int> > ans;
long long minnow=INT_MAX;
void DFS(int start,int endd,int lennow,vector<int> now,vector<int> visited,int n)
{
    if(start==endd){
        if(lennow==minnow)
        {
            now.push_back(endd);
            ans.push_back(now);
        }
        else if(lennow<minnow)
        {
             now.push_back(endd);
             ans.clear();
            ans.push_back(now);
            minnow=lennow;
        }
    }
    else{
        now.push_back(start);
        visited[start]=1;
        for(int i=0;i<=n;i++)
            if(visited[i]!=1 && matrix[start][i]!=INT_MAX)
                if((matrix[start][i]+lennow)<=minnow)
                    DFS(i,endd,matrix[start][i]+lennow,now,visited,n);
        visited[start]=0;
        now.pop_back();
    }
    return ;
}
 
int main()
{
    //freopen("a.txt","r",stdin);
    fill(matrix[0],matrix[0]+N*N,INT_MAX);
    int maxc,n,sp,roadl;cin>>maxc>>n>>sp>>roadl;
    matrix[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        int now;cin>>now;
        matrix[i][i]=0;
        cap[i]=now;
    }
    for(int i=0;i<roadl;i++)
    {
        int a1,a2,a3;
        cin>>a1>>a2>>a3;
        if(a3<matrix[a1][a2])
        {matrix[a1][a2]=a3;
        matrix[a2][a1]=a3;
        }
    }
    vector<int> now;
    vector<int> visited(n);
    DFS(0,sp,0,now,visited,n);
    int minsum=INT_MAX,maxj=-1,maxy=-1;
    for(int i=0;i<ans.size();i++)
    {int sum=0;int y=0;//sum是带几个去。y是带几个回来
        for(int j=1;j<ans[i].size();j++)
         {
            if(maxc/2<=cap[ans[i][j]])  sum+=cap[ans[i][j]]-maxc/2;//代表多出来几个;
            else{
                    int u=maxc/2-cap[ans[i][j]];//这个少了几个
                    if(sum>=u) sum=sum-u;//如果当前能补齐
                    else{ y+=u-sum;sum=0;}//如果当前补不齐
                }
         }
         if(y<minsum) {minsum=y;maxj=i;maxy=sum;}
    }
    cout<<minsum<<" ";
    for(int j=0;j<ans[maxj].size()-1;j++)
         cout<<ans[maxj][j]<<"->";
         cout<<ans[maxj][ans[maxj].size()-1]<<" "<<maxy;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值