1. 程式人生 > >Public Bike Management (30)(DFS,VRCTOR,模擬)(PAT甲級)

Public Bike Management (30)(DFS,VRCTOR,模擬)(PAT甲級)

continue mes ret esp 之間 長度 space 修改 優先

#include<bits/stdc++.h>
using namespace std;
const int inf = 1e9;
int sum,n,tar,m;
int num[507];
int edge[507][507];
int u,v,val;
int mn=inf,mn_send=inf,mn_back=inf;
int cur=0,cur_send=0,cur_back=0;
int vis[507];
vector<int>cur_path,ans;
void dfs(int x){
if(cur>mn)//已經不是最短路,無需深入了
return;
if(x==tar){//到達目標點,有更優解就更新


if(cur<mn){
mn=cur;
mn_send=cur_send;
mn_back=cur_back;
ans=cur_path;
}
else if(cur==mn&&(cur_send<mn_send||cur_send==mn_send&&cur_back<mn_back)){
mn_send=cur_send;
mn_back=cur_back;

ans=cur_path;
}
return;
}
for(int i=1;i<=n;++i){
if(vis[i]||edge[x][i]==inf)//前面已經經過該點或者此路不通就換下一個點
continue;
vis[i]=1;
cur_path.push_back(i);//放進路徑中
cur+=edge[x][i];//修改當前路徑長度
int tmp_send=cur_send;//存放當前需要發出
int tmp_back=cur_back;//存放當前需要返回

if(num[i]+cur_back<sum/2)//如果當前站缺車
cur_send+=sum/2-num[i]-cur_back,cur_back=0;
else//當前站不缺車
cur_back+=num[i]-sum/2;
dfs(i);//在這個點的基礎上接著深入
cur_path.pop_back();//還原到沒有經過i點之前的狀態
vis[i]=0;
cur-=edge[x][i];
cur_send=tmp_send;
cur_back=tmp_back;
}
}
int main(){
std::ios::sync_with_stdio(false);//關閉同步
cin>>sum>>n>>tar>>m;
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)
edge[i][j]=inf,edge[j][i]=inf;//初始化讓所有點之間路徑無限長
for(int i=1;i<=n;++i)
cin>>num[i];
for(int i=1;i<=m;++i){
cin>>u>>v>>val;
edge[u][v]=val;
edge[v][u]=val;
}
dfs(0);//從根節點開始深度優先搜索
cout<<mn_send<<" 0";
for(auto&it:ans)
cout<<"->"<<it;
cout<<" "<<mn_back;
return 0;
}

Public Bike Management (30)(DFS,VRCTOR,模擬)(PAT甲級)