zoukankan      html  css  js  c++  java
  • 小蝌蚪找妈妈 牛客

    链接: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
    ",Min);
    50     }
    51     return 0;
    52 }
    纵使单枪匹马,也要勇闯天涯
  • 相关阅读:
    HTTP协议 (二) 基本认证
    HTTP协议详解
    Wireshark基本介绍和学习TCP三次握手
    Fiddler 教程
    UNIX网络编程——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)
    修改一行SQL代码 性能提升了100倍
    修改一行SQL代码 性能提升了100倍
    vector map 多层嵌套使用
    vector map 多层嵌套使用
    应该记住的话
  • 原文地址:https://www.cnblogs.com/sj-gank/p/11449164.html
Copyright © 2011-2022 走看看