PAT 1018. Public Bike Management (30)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值