比赛 20150422 评测结果 AAAAATTAAAA
题目名称 背驮式行走 最终得分 81
用户昵称 wolf. 运行时间 3.000 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2015-04-22 09:10:00
显示代码纯文本
#include<iostream>
#include<fstream>
#include<vector>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
ifstream fin("piggyback.in");
ofstream fout("piggyback.out");
const long long IMAX=9999999999999ll;
long long B,E,P,N;
vector<vector<int> > TT;
vector<long long> dis;//最短时间
vector<long long> AA;//A到该点的最短时间
vector<long long> BB;//B到该点的最短距离
long long core(){
	dis.resize(N+2,IMAX);
	AA=dis;BB=dis;
	queue<int> Q;
	Q.push(1);
	Q.push(2);
	AA[1]=0;
	BB[2]=0;
	while(!Q.empty()){
		int p=Q.front();
		Q.pop();
		bool fall=0;
		for(int i=0;i!=TT[p].size();++i){
			fall=0;
			if(AA[TT[p][i]]>AA[p]+B){
				AA[TT[p][i]]=AA[p]+B;
				fall=1;
			}
			if(BB[TT[p][i]]>BB[p]+E){
				BB[TT[p][i]]=BB[p]+E;
				fall=1;
			}
			if(dis[TT[p][i]]>AA[p]+BB[p]+P||dis[TT[p][i]]>dis[p]+P){
				dis[TT[p][i]]=min(AA[p]+BB[p]+P,dis[p]+P);
				fall=1;
			}
			if(fall){
				Q.push(TT[p][i]);
			}
		}
	}
	return min(dis[N],AA[N]+BB[N]);
}
int main(){
	int m;
	fin>>B>>E>>P>>N>>m;
	TT.resize(N+2);
	for(int i=0;i!=m;++i){
		int a,b;
		fin>>a>>b;
		//cout<<a<<"  "<<b<<endl;
		TT[a].push_back(b);
		TT[b].push_back(a);
	}
	/*for(int i=0;i!=TT.size();++i){
		cout<<i<<":";
		for(int j=0;j!=TT[i].size();++j){
			cout<<TT[i][j]<<"  ";
		}
		cout<<endl;
	}*/
	fout<<core()<<endl;
	/*for(int i=0;i!=N+1;++i){
		cout<<AA[i]<<" ";
	}
	cout<<endl;
	for(int i=0;i!=N+1;++i){
		cout<<BB[i]<<" ";
	}
	cout<<endl;
	for(int i=0;i!=N+1;++i){
		cout<<dis[i]<<" ";
	}
	cout<<endl;*/
	return 0;
}
//designed by wolf