#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int INF=1e8;
int C,N,Sp,M;
vector<int> edg[505];
int bikes_in_station[505];
int taketime[505][505];
vector<int> tmpPath,ansPath;
int Min_Time=INF;
int Min_need_num=INF;
int Min_bak_num=INF;
int visit[505]={0};
void dfs(int station,int need,int bak,int totalTime){
totalTime+=station!=0?taketime[tmpPath[tmpPath.size()-1]][station]:0;
tmpPath.push_back(station);
visit[station]=1;
if(bikes_in_station[station]<0)
if(bak>=abs(bikes_in_station[station]))
bak-=abs(bikes_in_station[station]);
else{
need+=abs(bikes_in_station[station])-bak;
bak=0;
}
else
bak+=bikes_in_station[station];
if(station==Sp){
if(totalTime<Min_Time||(totalTime==Min_Time&&need<Min_need_num)||(totalTime==Min_Time&&need==Min_need_num&&bak<Min_bak_num)){
Min_Time=totalTime;
Min_need_num=need;
Min_bak_num=bak;
ansPath=tmpPath;
}
}else{
int s=edg[station].size();
for(int i=0;i<s;++i){
int v=edg[station][i];
if(visit[v]==0) dfs(v,need,bak,totalTime);
}
}
tmpPath.pop_back();
visit[station]=0;
}
int main(){
scanf("%d%d%d%d",&C,&N,&Sp,&M);
int perfectBN=C/2;
for(int i=1;i<=N;++i){
scanf("%d",&bikes_in_station[i]);
bikes_in_station[i]-=perfectBN; //正数表示要送回PBMC的数量,负数的绝对值表示需要带来的数量;
}
for(int i=0;i<M;++i){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
taketime[a][b]=taketime[b][a]=c;
edg[a].push_back(b);
edg[b].push_back(a);
}
dfs(0,0,0,0);
printf("%d ",Min_need_num);
for(int i=0;i<ansPath.size();++i){
printf("%d",ansPath[i]);
if(i<ansPath.size()-1) printf("->");
}
printf(" %d",Min_bak_num);
system("pause");
return 0;
}
PAT甲级1018——Public Bike Management(DFS大法)
最新推荐文章于 2024-10-06 10:17:48 发布