记录编号 |
221664 |
评测结果 |
WAAAAAAREE |
题目名称 |
分糖果 |
最终得分 |
60 |
用户昵称 |
liu_runda |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
1.103 s |
提交时间 |
2016-01-25 14:07:42 |
内存使用 |
19.24 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct edge{
int to,suc;
}lst[3000000];
int first[100005];//first[i]:i号小朋友的第一条边在edge中的下标,0:no
bool visited[100005];
int n,p,c,m;
int tot=1;//目前总边数+1
void add_edge(int start,int end){
lst[tot].to = end;
lst[tot].suc = first[start];
first[start] = tot++;
}
int ans[100005];//c到i经过几次传递
int main(){
freopen("dividecandy.in","r",stdin);
freopen("dividecandy.out","w",stdout);
scanf("%d %d %d %d",&n,&p,&c,&m);
int tmp1,tmp2,maxn = 0;
queue<int> q;
for(int i = 0;i<p;i++){
scanf("%d%d",&tmp1,&tmp2);
add_edge(tmp1,tmp2);
add_edge(tmp2,tmp1);
}
ans[c] = -1;
for(int pt = first[c];pt;pt = lst[pt].suc){
ans[lst[pt].to] = 1;
q.push(lst[pt].to);
maxn = 1;
}
while(!q.empty()){
int v = q.front();
q.pop();
for(int pt = first[v];pt;pt = lst[pt].suc){
if(!ans[lst[pt].to]){
ans[lst[pt].to] = ans[v]+1;
q.push(lst[pt].to);
if(ans[lst[pt].to]>maxn)maxn = ans[lst[pt].to];
}
}
}
printf("%d",m+maxn+1);
fclose(stdin);fclose(stdout);
return 0;
}