Files
OI-source/history_source/信息学奥赛一本通/3.4.3.5.cpp
2023-08-03 09:22:52 +08:00

81 lines
1.3 KiB
C++

#include<cstdio>
#include<cstring>
#define maxn 100000
struct node
{
int id;
long long step;
};
int *tu[maxn+1],num[maxn+1],n,p,c,i,j,a,b,head,tail;
long long m;
node queue[maxn+5];
char mem[maxn/8+5];
bool r(int idx)
{
return mem[idx/8]&(1<<(idx%8));
}
int w(int idx,int v)
{
mem[idx/8]&=~(1<<(idx%8));
mem[idx/8]|=1<<(idx%8);
return v;
}
inline char get()
{
static char ch;
fread(&ch,1,1,stdin);
return ch;
}
inline long long read()
{
static long long a;
static char ch;
a=0;
while(ch=get(),!(ch>='0'&&ch<='9'));
a=ch-'0';
while(ch=get(),ch>='0'&&ch<='9') a=a*10+ch-'0';
return a;
}
int main()
{
freopen("candy.in","rb",stdin);
freopen("candy.out","w",stdout);
n=read();p=read();c=read();
m=read();
for(i=0;i<p;i++)
{
a=read();b=read();
num[a]++;
num[b]++;
}
freopen("candy.in","rb",stdin);
for(i=1;i<=n;i++) tu[i]=new int[num[i]];
n=read();p=read();c=read();
m=read();
memset(num,0,sizeof(num));
for(i=0;i<p;i++)
{
a=read();b=read();
tu[a][num[a]++]=b;
tu[b][num[b]++]=a;
}
node t,t2;
t.id=c;
t.step=1;
queue[tail++]=t;
w(c,1);
while(head<tail)
{
t=queue[head++];
for(i=0;i<num[t.id];i++)
if(!r(tu[t.id][i]))
{
queue[tail].id=tu[t.id][i];
queue[tail].step=t.step+1;
w(queue[tail++].id,1);
}
}
printf("%lld\n",queue[tail-1].step+m);
return 0;
}