PAT甲级1018——Public Bike Management(DFS大法)

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值