• PTA热身赛第二场补题报告


    L2-031 深入虎穴 (25 分)

     1.题意 

      情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门,不存在两条路通向同一扇门,找出距离入口最远的那扇门。给定门的数量N,接下来 N 行,第 i 行描述编号为 i 的那扇门背后能通向的门。在一行中输出距离入口最远的那扇门的编号。

     2.题解

      题目没给入口,先把入口找到,因为没有哪扇门会通向入口,所以用vis数组记录每个门是否被通向,没被通向的那扇门就是入口。用vector数组存每扇门通往的门,再用dfs搜到最深点,特判只有一扇门的情况,直接输出1。

    3.代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e5 + 5;
     4 int n, ru;
     5 int vis[maxn];
     6 vector<int> mp[maxn];
     7 int mmax = 0;
     8 int ans = 0;
     9 void dfs(int pr, int cnt) {
    10     if(mp[pr].size() == 0) {
    11         if(cnt > mmax) {
    12             ans = pr;
    13             mmax = cnt;
    14         }
    15         return;
    16     }
    17     
    18     for(int i = 0; i < (int)mp[pr].size(); i++) {
    19         dfs(mp[pr][i], cnt + 1);
    20     }
    21 }
    22 int main() {
    23     cin >> n;
    24     for(int i = 1; i <= n; i++) {
    25         int k;
    26         cin >> k;
    27         int x;
    28         for(int j = 1; j <= k; j++) {
    29             cin >> x;
    30             mp[i].push_back(x);
    31             vis[x] = 1;
    32         }
    33     }
    34     
    35     if(n == 1) {
    36         cout << 1 << endl;
    37         return 0;
    38     }
    39     
    40     for(int i = 1; i <= n; i++) {
    41         if(vis[i] == 0) {
    42             ru = i;
    43             break;
    44         }
    45     } 
    46     
    47     dfs(ru, 0);
    48     
    49     cout << ans << endl;
    50     
    51     return 0;
    52 } 
    View Code
  • 相关阅读:
    BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)
    牛客练习赛1 A
    2018年全国多校算法寒假训练营练习比赛(第一场)J
    2018年全国多校算法寒假训练营练习比赛(第一场)C
    2018年全国多校算法寒假训练营练习比赛(第一场)D
    2018年全国多校算法寒假训练营练习比赛(第一场)E
    Wannafly挑战赛7 E
    Wannafly挑战赛7 C
    Wannafly挑战赛7 B
    Wannafly挑战赛7 D
  • 原文地址:https://www.cnblogs.com/lvguapi/p/14591466.html
Copyright © 2020-2023  润新知