比赛 20150422 评测结果 AAAAAAAAAAA
题目名称 背驮式行走 最终得分 100
用户昵称 ggwdwsbs 运行时间 0.082 s
代码语言 C++ 内存使用 1.83 MiB
提交时间 2015-04-22 11:46:05
显示代码纯文本
//预处理从 1 Bessie走到每个点的距离,从 1 Elsie走到每个点的距离 
//      从每个点背着走到终点的距离.
#include<stdio.h>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int maxn=40010;
int vis[maxn];
long long d[3][maxn];
vector<int>a[maxn];
int b,e,p,n,m,l,r;
int bfs(int dis,int k,int U)
{
	memset(vis,0,sizeof(vis));
	queue<int>q;
	q.push(U);
	d[k][U]=0;
	vis[U]=1;
	while(q.size()>0)
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<a[u].size();i++)
		{
			int v=a[u][i];
			if(!vis[v])
			{
				vis[v]=1;
				q.push(v);
				d[k][v]=d[k][u]+dis;
			}
		}
	}
}
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++)
	{
		scanf("%d%d",&l,&r);
		a[l].push_back(r);
		a[r].push_back(l);
	}
	bfs(b,0,1);
	bfs(e,1,2);
	bfs(p,2,n);
	long long ret=d[0][n]+d[1][n];
	for(int i=1;i<=n;i++)
	{
		if(ret>d[0][i]+d[1][i]+d[2][i])
		 ret=d[0][i]+d[1][i]+d[2][i];
	}
	printf("%lld",ret);
}