比赛 20150422 评测结果 AWWWTEEEEEE
题目名称 背驮式行走 最终得分 9
用户昵称 一個人的雨 运行时间 2.886 s
代码语言 C++ 内存使用 191.49 MiB
提交时间 2015-04-22 11:39:17
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
int a[5000][5000];
int b[5000][4999];
long long cost=0,cost1=0;
int pd1,pd2,pd3;
int dis1[40000],dis2[40000],dis[40000];
int e,p,n,m,bbb;

int Tbfs(int x,int y){
	queue<int>q1;//B
	queue<int>q2;//E
	q1.push(x);
	q2.push(y);
	memset(dis1,0x7f,sizeof(dis1));
	memset(dis2,0x7f,sizeof(dis2));
	bool f1[40000]={0};
	bool f2[40000]={0};
	f1[x]=1;
	f2[y]=1;
	dis1[x]=dis2[y]=0;
	while (!q1.empty()&&!q2.empty())
	{
		int k=q1.front();
		int o=q2.front();
		for (int i=1;i<=b[k][0];++i)
		 if (a[k][b[k][i]]==1&&(!f1[b[k][i]]||dis1[k]+1<dis1[b[k][i]]))
		  {
		  	dis1[b[k][i]]=dis1[k]+1;
		  	if (!f1[b[k][i]])
		  	{
		  		q1.push(b[k][i]);
				f1[b[k][i]]=1;
		  	}
			if (f2[b[k][i]]==1)
		  			return b[k][i]; 
		  }
		q1.pop();
		for (int i=1;i<=b[o][0];++i)
		 if (a[o][b[o][i]]==1&&(!f2[b[o][i]]||dis2[o]+1<dis2[b[o][i]]))
		 {
		 	dis2[b[o][i]]=dis2[o]+1;
		 	if (!f2[b[o][i]])
		 	{
		 		q2.push(b[o][i]);
		 		f2[b[o][i]]=1;	
		 	}
			if (f1[b[o][i]]==1)
		 		 return b[o][i];
		 }
		q2.pop();
	}
	return -1;
}

void spfa(int x){
	bool f[40000]={0};
	memset(dis,0x7f,sizeof(dis));
	queue<int> q;
	dis[x]=0;
	q.push(x);
	f[x]=1;
	while(!q.empty())
	{
		int k=q.front();
		for(int i=1;i<=b[k][0];i++)
		{
			if(a[k][b[k][i]]==1&&dis[b[k][i]]>dis[k]+1)
			{
				dis[b[k][i]]=dis[k]+1;
				if(!f[b[k][i]])
				{
					q.push(b[k][i]);
					f[b[k][i]]=1;
				}
			}
		}
		f[k]=0;
		q.pop();
	}
}

int main()
{
 freopen("piggyback.in","r",stdin);
 freopen("piggyback.out","w",stdout);
 scanf("%d%d%d%d%d",&bbb,&e,&p,&n,&m);
 int x,y;
 memset(a,0,sizeof(a));
 for (int i=1;i<=m;++i)
 {
 	scanf("%d%d",&x,&y);
 	a[x][y]=1;
 	//a[y][x]=1;
	b[x][++b[x][0]]=y;
	//b[y][++b[y][0]]=x;
 }
 if (p<bbb+e) {
 	pd1=Tbfs(1,2);
 	if (pd1!=-1)
 	{
 		//cout<<dis1[pd1]<<" "<<dis2[pd1]<<" ";
 		cost1=dis1[pd1]*bbb+dis2[pd1]*e;
 		//cout<<cost1<<" ";
 		spfa(pd1);
 		cost1+=dis[n]*p;
 		//cout<<pd1<<" ";
 	}
 	else cost=0x7ffffffff;
 }
 spfa(1);
 cost=0;
 cost+=dis[n]*bbb;
 spfa(2);
 cost+=dis[n]*e;
 //cout<<cost<<" ";
 if (cost<cost1) cout<<cost;
  else cout<<cost1;
 return 0;
}