记录编号 159732 评测结果 AAAAAAAAAAA
题目名称 背驮式行走 最终得分 100
用户昵称 GravatarRa-xp 是否通过 通过
代码语言 C++ 运行时间 0.097 s
提交时间 2015-04-22 15:32:12 内存使用 1.84 MiB
显示代码纯文本
#include<iostream>
#include<fstream>
#include<cstring>
#include<algorithm>
#include<stdio.h>
#include<vector>
#include<cmath>
#include<cstdio>
#include<queue>
#define MAXN 40000+10
using namespace std;
int b, e, p, n, m;
vector<int> map[MAXN];
long long d[3][MAXN];
int vis[MAXN];
void bfs(int x, int y, int z)
{
	memset(vis, 0, sizeof(vis));
	queue<int> q;
	q.push(z);
	d[y][z]=0;
	vis[z]=1;
	for( ;q.size()>0; )
	{
		int z=q.front();
		q.pop();
		for(int i=0;i<int(map[z].size());i++)
		{
			int v=map[z][i];
			if(!vis[v])
			{
				vis[v]=1;
				q.push(v);
				d[y][v]=d[y][z]+x;
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	freopen("piggyback.in","r",stdin);
	freopen("piggyback.out","w",stdout);
	int i, j, k;
	cin>>b>>e>>p>>n>>m;
	for(i=1;i<=m;i++)
	{
		cin>>j>>k;
		map[j].push_back(k);
		map[k].push_back(j);
	}
	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];
		}
	}
	cout<<ret<<endl;
	return 0;
}