比赛 20150422 评测结果 AAAAAAAAAAA
题目名称 背驮式行走 最终得分 100
用户昵称 mikumikumi 运行时间 1.191 s
代码语言 C++ 内存使用 20.31 MiB
提交时间 2015-04-22 09:26:04
显示代码纯文本
#include<cstdio>
#include<deque>
#include<iostream>
using namespace std;
typedef long long LL;
int b,e,p,n,m;
int maxn=0xffffff;
LL sw[3][40001],ans=maxn;
class miku
{
public:
	int to;
	int lo;
};
deque<miku> bj[3][40001];
int in(int a,int q,int s,int i)
{
	miku x;
	x.to=q;x.lo=s;
	bj[i][a].push_back(x);
	x.to=a;
	bj[i][q].push_back(x);
	return 0;
}
int spfa(int x,int v)
{
	deque<int> q;
	int iq[40001]={0};
	q.push_back(x);
	iq[x]=1;
	sw[v][x]=0;
	while(!q.empty())
	{
		int w=q.front();
		q.pop_front();
		iq[w]=0;
		for(int j=0;j<bj[v][w].size();j++)
		{
			miku z=bj[v][w][j];
			if(z.lo+sw[v][w]<sw[v][z.to])
			{
				sw[v][z.to]=z.lo+sw[v][w];
				if(iq[z.to]==0)
				{
					iq[z.to]=1;
					q.push_back(z.to);
				}
			}
		}
	}
	return 0;
}
int main()
{
	freopen("piggyback.in","r",stdin);
	freopen("piggyback.out","w",stdout);
	scanf("%d%d%d%d%d",&b,&e,&p,&n,&m);
	for(int i=1;i<=m;i++)
	{
		int a,c;
		scanf("%d%d",&a,&c);
		in(a,c,b,0);
		in(a,c,e,1);
		in(a,c,p,2);
	}
	for(int i=0;i<=2;i++)
	{
		for(int j=1;j<=n;j++)
		sw[i][j]=maxn;
	}
	spfa(1,0);
	spfa(2,1);
	spfa(n,2);
	for(int i=1;i<=n;i++)
	{
		LL r=sw[0][i]+sw[1][i]+sw[2][i];
		if(r<ans)
		ans=r;
		
	}
	cout<<ans<<endl;
	/*for(int i=0;i<=2;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<sw[i][j]<<" ";
		}
		cout<<endl;
	}*/
	return 0;
}