zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JavaScript基础知识-标识符
    free命令常用参数详解及常用内存工具介绍
    GO语言的进阶之路-初探GO语言
    HTML&CSS基础-字体的其它样式
    HTML&CSS基础-字体的分类
    HTML&CSS基础-字体的样式
    python运维常用相关模块
    HTML&CSS基础-颜色的单位表示方法
    HTML&CSS基础-长度单位
    HTML&CSS基础-定义列表
  • 原文地址:https://www.cnblogs.com/pczhou/p/4296598.html
Copyright © 2011-2022 走看看