记录编号 165840 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010冲刺十三]逃离遗迹 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.038 s
提交时间 2015-06-13 07:11:29 内存使用 2.28 MiB
显示代码纯文本
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int temp,minl=2100000000,t,n,a,b,c,u,v,w,shu,first[22222],dis[22222],dd[22222];
queue<int>q;
bool p[22222];
char s;
struct bian
{
	int u,v,next,w;
}o[111111];
void add(int u,int v,int w)
{
	o[++shu].u=u;
	o[shu].v=v;
	o[shu].w=w;
	o[shu].next=first[u];
	first[u]=shu;
}
int in()
{
	temp=0;s=getchar();
	while(s<'0'||s>'9')
		s=getchar();
	for(;s>='0'&&s<='9';s=getchar())
		temp=temp*10+s-48;
	return temp;
}
int main()
{
	freopen("escapeb.in","r",stdin);
	freopen("escapeb.out","w",stdout);
	n=in();
	a=in();
	b=in();
	c=in();
	for(int i=1;i<n;i++)
	{
		u=in();
		v=in();
		w=in();
		add(u,v,w);
		add(v,u,w);
	}
//////////////////////////////////////////////////////////////////////
	memset(dis,0x3f,sizeof(dis));
	dis[a]=0;
	q.push(a);
	while(!q.empty())
	{
		u=q.front();
		for(int j=first[u];j;j=o[j].next)
		    if(dis[u]+o[j].w<dis[o[j].v])
		    {
				dis[o[j].v]=dis[u]+o[j].w;
				if(!p[o[j].v])
				{
					q.push(o[j].v);
					p[o[j].v]=1;
				}
		    }
		p[u]=0;
		q.pop();
	}
	for(int i=1;i<=n;i++)
	    dd[i]+=dis[i];
////////////////////////////////////////////////////////////////////////
	memset(dis,0x3f,sizeof(dis));
	dis[b]=0;
	q.push(b);
	while(!q.empty())
	{
		u=q.front();
		for(int j=first[u];j;j=o[j].next)
		    if(dis[u]+o[j].w<dis[o[j].v])
		    {
				dis[o[j].v]=dis[u]+o[j].w;
				if(!p[o[j].v])
				{
					q.push(o[j].v);
					p[o[j].v]=1;
				}
		    }
		p[u]=0;
		q.pop();
	}
	for(int i=1;i<=n;i++)
	    dd[i]+=dis[i];
////////////////////////////////////////////////////////////////////////
	memset(dis,0x3f,sizeof(dis));
	dis[c]=0;
	q.push(c);
	while(!q.empty())
	{
		u=q.front();
		for(int j=first[u];j;j=o[j].next)
		    if(dis[u]+o[j].w<dis[o[j].v])
		    {
				dis[o[j].v]=dis[u]+o[j].w;
				if(!p[o[j].v])
				{
					q.push(o[j].v);
					p[o[j].v]=1;
				}
		    }
		p[u]=0;
		q.pop();
	}
	for(int i=1;i<=n;i++)
	    dd[i]+=dis[i];
////////////////////////////////////////////////////////////////////////
	for(int i=1;i<=n;i++)
	    if(minl>dd[i])
	    {
			minl=dd[i];
			t=i;
	    }
	printf("%d\n%d",t,minl);
}