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;
}