#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
int dis,from,to,next;
};
node edge[99999999];
int dis[100009];
int que[100009];\\循环队列要开大;
int num=1;
int head[100009];
int b[100009];
void add(int from,int to)
{
edge[num].from=from;
edge[num].to=to;
edge[num].dis=1;
edge[num].next=head[from];
head[from]=num;
num++;
}
int main()
{
int m,n,p,ti;
scanf("%d%d%d",&m,&n,&p);
scanf("%d",&ti);
for(int i=1;i<=m;i++)
dis[i]=0x7fffffff/3;
for(int i=1;i<=n;i++)
edge[i].dis=0x7fffffff/3;
int x,y;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dis[p]=0;
b[p]=1;
int t=1,h=0;
que[t]=p;
while(h!=t)
{
h++;
h=(h-1)%100007+1;\\取余数要大;
int u=que[h];
b[u]=0;
for(int i=head[u];i!=0;i=edge[i].next)
{
if(dis[edge[i].to]>dis[u]+edge[i].dis)
{
dis[edge[i].to]=dis[u]+edge[i].dis;
if(b[edge[i].to]==0)
{
t++;
t=(t-1)%100007+1;
que[t]=edge[i].to;
}
}
}
}
int maxx=0;
for(int i=1;i<=m;i++)
maxx=max(maxx,dis[i]);
printf("%d",maxx+1+ti);
}
队列实现;
#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
int to,from,next;
};
int flag[100009];
node edge[9999999];
int head[100009];
int num=1;
int dis[100009];
int que[100009];
void add(int from,int to)
{
edge[num].from=from;
edge[num].to=to;
edge[num].next=head[from];
head[from]=num;
num++;
}
int main()
{
int n,m,p;
int ti;
scanf("%d%d%d",&m,&n,&p);
scanf("%d",&ti);
for(int i=1;i<=m;i++)
dis[i]=0x7fffffff/3;
int x,y;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
int t=1,h=0;
dis[p]=0;
flag[p]=1;
que[t]=p;
while(h!=t)
{
h++;
h=(h-1)%100000+1;
int u=que[h];
flag[u]=1;
for(int i=head[u];i!=0;i=edge[i].next)
{
if(flag[edge[i].to]==0)
{
dis[edge[i].to]=dis[u]+1;
flag[edge[i].to]=1;
t++;
t=(t-1)%100000+1;
que[t]=edge[i].to;
}
}
}
int maxx=0;
for(int i=1;i<=m;i++)
maxx=max(maxx,dis[i]);
printf("%d",maxx+1+ti);
return 0;
}