比赛 至少完成十道练习 评测结果 AAAAAAAAAA
题目名称 分糖果 最终得分 100
用户昵称 Menamovic 运行时间 1.028 s
代码语言 C++ 内存使用 51.06 MiB
提交时间 2017-05-21 10:21:17
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int INF=2147483627;
int n,p,c,ans,g[1010000],tot,dis[1010000],m,q[1010000];
bool inq[1010000];
struct edge
{
	int t;
	int next;
}e[5010000];
void addedge(int a,int b)
{
	e[++tot].t=b;
	e[tot].next=g[a];
	g[a]=tot;
}
void spfa()
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=INF;
	}
	int head=0;
	int tail=1;
	dis[c]=0;
	q[tail]=c;
	inq[c]=true;
	while(head!=tail)
	{
		head++;
		head=(head-1)%1010000+1;
		int x=q[head];
		inq[x]=false;
		for(int i=g[x];i;i=e[i].next)
		{
			if(dis[e[i].t]>dis[x]+1)
			{
				dis[e[i].t]=dis[x]+1;
				if(!inq[e[i].t])
				{
					tail++;
					tail=(tail-1)%1010000+1;
					q[tail]=e[i].t;
					inq[e[i].t]=true;
				}
			}
		}
	}
}
int main()
{
	freopen("dividecandy.in","r",stdin);
	freopen("dividecandy.out","w",stdout);
	scanf("%d%d%d%d",&n,&p,&c,&m);
	for(int i=1;i<=p;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		addedge(a,b);
		addedge(b,a);
	}
	spfa();
	for(int i=1;i<=n;i++)
	{
		if(dis[i]>ans&&i!=c) ans=dis[i];
	}
	printf("%d",ans+m+1);
	return 0;
}