链接:https://ac.nowcoder.com/acm/problem/14663
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
青蛙妈妈最近很不放心把蝌蚪宝宝送到幼儿园,但当她买菜回家时,却发现可爱的孩子小蝌蚪走丢了。
小池塘里有很多石头,青蛙家在其中标号为s的石头上。小蝌蚪会移动k分钟,每分钟会出现在任意石头旁边,甚至多次出现在一块石头旁边。但k分钟之后,蝌蚪宝宝就游不动了。
青蛙妈妈第0秒从家所在的石头出发,每分钟移动一次,可以留在原地,也可以跳跃到一块当前可跳跃到的石头上(只能在特定的石头间双向跳跃)。
小池塘里有很多石头,青蛙家在其中标号为s的石头上。小蝌蚪会移动k分钟,每分钟会出现在任意石头旁边,甚至多次出现在一块石头旁边。但k分钟之后,蝌蚪宝宝就游不动了。
青蛙妈妈第0秒从家所在的石头出发,每分钟移动一次,可以留在原地,也可以跳跃到一块当前可跳跃到的石头上(只能在特定的石头间双向跳跃)。
输入描述:
多组数据。
第一行输入石头个数n,青蛙妈妈可以跳跃的石头对数m,蝌蚪宝宝的活动时间k,青蛙家所在的石头s。
之后输入k个数,其中第i个数代表第i分钟蝌蚪宝宝的位置,编号从i=1开始。
接下来输入m行,每行包括两个数u,v,表示青蛙妈妈可以在第u个和第v个石头间双向跳跃。
输出描述:
请输出青蛙妈妈最少几分钟发现蝌蚪宝宝。
备注:
1≤n≤100000,
1≤m≤2∗n,
1≤k≤100000,
1≤s≤n,
1≤u,v≤n,
无重边,无自环,保证联通,
数据不多于10组
分析::
求出青蛙起点到任一点的最短时间,再与青蛙在该地的时刻进行比较,更新最小值
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int maxn=1e5+5; 5 int mb[maxn]; 6 int dis[maxn]; 7 int n,m,k,s; 8 vector<int>v[maxn]; 9 queue<int>que; 10 int main() 11 { 12 while(~scanf("%d",&n)) 13 { 14 scanf("%d%d%d",&m,&k,&s); 15 for(int i=1;i<=k;i++){ 16 scanf("%d",&mb[i]); 17 } 18 for(int i=0;i<=n;i++){ 19 dis[i]=0; 20 v[i].clear(); 21 } 22 for(int i=1;i<=m;i++){ 23 int a,b; 24 scanf("%d%d",&a,&b);//邻接表记录 25 v[a].push_back(b); 26 v[b].push_back(a); 27 } 28 que.push(s); 29 while(!que.empty()) 30 { 31 int t=que.front(); 32 que.pop(); 33 for(int i=0;i<v[t].size();i++) 34 { 35 if(dis[v[t][i]]==0&&v[t][i]!=s){//最先达到一定时间最短,且不能为起点,起点一秒的时候最短 36 dis[v[t][i]]=dis[t]+1; 37 que.push(v[t][i]); 38 } 39 } 40 } 41 int Min=1e9+77; 42 for(int i=1;i<=k;i++) 43 { 44 if(dis[mb[i]]<=i){//如果可以在i时刻或之前到更新最短时间,因为可以选择不动 45 if(i<Min){Min=i;} 46 } 47 } 48 if(Min==1e9+77)Min=dis[mb[k]];//当k时刻内都未找到,那麽直接输出到达最后点的时间 49 printf("%d ",Min); 50 } 51 return 0; 52 }