• hihocoder1062 最近公共祖先·一


    问题描述:

    已知人名构成的父子关系树(或者森林),对于给定的两个人名name1和name2,求其最近公共祖先。题目保证人名不重复。

    分析:

    当数据量不是很大询问不是很多的时候,利用C++ STL中的map和set容器可以很方便的实现。用map容器存储父子关系。对于每一个询问,先将从name1开始到树根的路径上的所有人名放入一个set容器,然后从name2开始向树根上溯,逐个检测人名是否已在set中即可。

    我的代码:

     1 #include <iostream>
     2 #include <string>
     3 #include <map>
     4 #include <set>
     5 
     6 using namespace std;
     7 
     8 map<string, string> fa;
     9 set<string> st;
    10 
    11 int main()
    12 {
    13     int n, m;
    14     while(cin>>n)
    15     {
    16         fa.clear();
    17         while(n--)
    18         {
    19             string s1, s2;
    20             cin>>s1>>s2;
    21             fa[s2] = s1;
    22         }
    23         cin>>m;
    24         while(m--)
    25         {
    26             string name1, name2;
    27             cin>>name1>>name2;
    28             st.clear();
    29             while(fa.find(name1)!=fa.end())
    30             {
    31                 st.insert(name1);
    32                 name1 = fa[name1];
    33             }
    34             st.insert(name1);
    35             int sz = st.size();
    36             bool flag = false;
    37             st.insert(name2);
    38             if(sz==st.size())
    39             {
    40                 cout<<name2<<endl;
    41                 flag = true;
    42                 continue;
    43             }
    44             else
    45             {
    46                 sz = st.size();
    47                 while(fa.find(name2)!=fa.end())
    48                 {
    49                     name2 = fa[name2];
    50                     st.insert(name2);
    51                     if(sz==st.size())
    52                     {
    53                         cout<<name2<<endl;
    54                         flag = true;
    55                         break;
    56                     }
    57                     else
    58                     {
    59                         sz = st.size();
    60                     }
    61                 }
    62             }
    63             if(!flag) cout<<-1<<endl;
    64         }
    65     }
    66 
    67     return 0;
    68 }

    题目链接:http://hihocoder.com/problemset/problem/1062

  • 相关阅读:
    JDBC statement的常用方法
    JDBC通过资源文件初始化
    django 常用命令
    pip 设置国内源
    Python中注释与声明
    PyQt5程序基本结构分析
    机器学习中常见的专业术语
    给Linux安装中文的man手册
    Vim:Vim入门级配置
    Linux 目录结构与目录操作
  • 原文地址:https://www.cnblogs.com/pczhou/p/4296598.html
Copyright © 2020-2023  润新知