小蝌蚪找妈妈 牛客

时间:2019-09-02
本文章向大家介绍小蝌蚪找妈妈 牛客,主要包括小蝌蚪找妈妈 牛客使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

链接:https://ac.nowcoder.com/acm/problem/14663

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

        青蛙妈妈最近很不放心把蝌蚪宝宝送到幼儿园,但当她买菜回家时,却发现可爱的孩子小蝌蚪走丢了。
        小池塘里有很多石头,青蛙家在其中标号为s的石头上。小蝌蚪会移动k分钟,每分钟会出现在任意石头旁边,甚至多次出现在一块石头旁边。但k分钟之后,蝌蚪宝宝就游不动了。
        青蛙妈妈第0秒从家所在的石头出发,每分钟移动一次,可以留在原地,也可以跳跃到一块当前可跳跃到的石头上(只能在特定的石头间双向跳跃)。

输入描述:

多组数据。
第一行输入石头个数n,青蛙妈妈可以跳跃的石头对数m,蝌蚪宝宝的活动时间k,青蛙家所在的石头s。
之后输入k个数,其中第i个数代表第i分钟蝌蚪宝宝的位置,编号从i=1开始。
接下来输入m行,每行包括两个数u,v,表示青蛙妈妈可以在第u个和第v个石头间双向跳跃。

输出描述:

请输出青蛙妈妈最少几分钟发现蝌蚪宝宝。
示例1

输入

复制
3 2 2 1
2 1
1 2
1 3
5 5 3 5
3 1 4
1 2
2 3
2 4
3 4
4 5

输出

复制
1
3

备注:

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\n",Min);
50     }
51     return 0;
52 }

原文地址:https://www.cnblogs.com/sj-gank/p/11449164.html