#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[101][101],vis[101],dis[101];
int bike[101],bike2[101],capacity[101],parent[101];
int dij(int c,int n,int p){
vis[0]=1;
bike[0]=0;
for(int i=1;i<=n;i++){
dis[i]=a[0][i];
bike[i]+=bike[0];
parent[i]=0;
}
while(true){
int min=0x3f3f3f3f,s=-1;
for(int i=1;i<=n;i++){
if(min>dis[i]&&(vis[i]==0)){
min=dis[i];
s=i;
}
}
if(s==-1) break;
// cout<<s<<endl;
vis[s]=1;
for(int i=1;i<=n;i++){
if(dis[i]>dis[s]+a[s][i]&&(vis[i]==0)){
dis[i]=dis[s]+a[s][i];
if(capacity[i]>(capa/2)){
bike[i]=capacity[i]-(capa/2);//多余的
}
else if(capacity[i]<(capa/2)){
bike2[i]=(capa/2)-capacity[i];//缺少的
}
if(bike[s]>0&&bike[i]>0){
bike[i]+=bike[s];
}
if(bike2[s]>0&&bike2[i]>0){
bike2[i]+=bike2[s];
}
if(bike[s]>0&&bike2[i]>0){
bike2[i]-=bike[s];
bike[s]=0;
if(bike2[i]<0){
bike[i]=-bike2[i];
bike2[i]=0;
}
}
parent[i]=s;
}
else if(dis[i]==dis[s]+a[s][i]&&(vis[i]==0)){
if(bike[i]<capacity[i]+capacity[s]){
bike[i]=capacity[s]+capacity[i];
parent[i]=s;
}
}
}
}
}
int print(int p){
// cout<<p<<endl;
if(p==0){
cout<<p<<' ';
return 0;
}
print(parent[p]);
cout<<p<<' ';
return 0;
}
int main(){
int capa,n,m,p;
int s1,s2,c;
memset(a,0x3f3f3f3f,sizeof(a));
cin>>capa>>n>>p>>m;
for(int i=1;i<=n;i++){
cin>>capacity[i];
}
for(int i=0;i<m;i++){
cin>>s1>>s2>>c;
a[s1][s2]=a[s2][s1]=c;
}
memset(dis,0x3f3f3f3f,sizeof(dis));
dij(capa,n,p);
cout<<bike[p]<<' '<<dis[p]<<endl;
print(p);
// for(int i=0;i<=n;i++){
// cout<<parent[i]<<endl;
// }
return 0;
}
PAT 1018. Public Bike Management (30)
最新推荐文章于 2020-06-28 22:52:01 发布