#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int MAX=510;
const int INF=1000000000;
int capacity, n, pro_station, m;
int d[MAX],bike_num[MAX]={0}, G[MAX][MAX];
bool visited[MAX]={false};
vector<int> pre[MAX];
void Dijkstra(){
fill(d,d+MAX,INF);
d[0]=0;
for(int i=0;i<n;i++){//n+1遍循环
int u=-1, minn=INF;
for(int j=0;j<=n;j++){//找点
if(!visited[j]&&d[j]<minn){u=j; minn=d[j];}
}
if(u==-1)return ;
visited[u]=true;
for(int j=0;j<=n;j++){
if(!visited[j]&&G[u][j]!=INF){
if(d[j]>G[u][j]+d[u]){
d[j]=G[u][j]+d[u];
pre[j].clear();
pre[j].push_back(u);
}
else if(d[j]==(G[u][j]+d[u])){ pre[j].push_back(u); }
}
}
}//n+1遍循环
}
vector<int> temp, ans;
int send=INF, take_back=INF;
void DFS(int v){
if(v==0){
temp.push_back(v);
int need=0, remain=0;
for(int i=temp.size()-1;i >=0;i--){
if(bike_num[temp[i]]>0){remain+=bike_num[temp[i]];}
else {
if(remain>=abs(bike_num[temp[i]])){remain-=abs(bike_num[temp[i]]);}
else {need+=abs(bike_num[temp[i]])-remain;remain=0;}
}
}
if(need<send){send=need;take_back=remain;ans=temp;}
else if(need==send&&remain<take_back){take_back=remain;ans=temp;}
temp.pop_back();
return ;
}
temp.push_back(v);
for(int i=0;i<pre[v].size();i++){
DFS(pre[v][i]);
}
temp.pop_back();
}
int main(){
int i, s1, s2, temp_time;
fill(G[0],G[0]+MAX*MAX,INF);
scanf("%d%d%d%d",&capacity,&n,&pro_station,&m);
for(i=1;i<=n;i++){
scanf("%d",&bike_num[i]);
bike_num[i]-=capacity/2;
}
for(i=0;i<m;i++){
scanf("%d%d%d",&s1,&s2,&temp_time);
G[s1][s2]=G[s2][s1]=temp_time;
}
Dijkstra();
DFS(pro_station);
printf("%d ",send);
for(i=ans.size()-1;i>=0;i--){
printf("%d",ans[i]);
if(i>0)printf("->");
}
printf(" %d",take_back);
return 0;
}
PAT-A1018
最新推荐文章于 2021-03-03 21:21:26 发布