hihocoder#1062 : 最近公共祖先·一
思路:用map存下每个节点及其父节点。每次询问时建立一个集合,将name1的所有祖先放入集合。
自底向上的遍历name2的所有祖先,如果在集合中则为最近公共祖先。
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<string>
#include<set>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 1001;
int main()
{
int n,m;
string name1,name2;
cin>>n;
map<string,string>mp;
while(n--)
{
cin>>name1>>name2;
mp[name2]=name1;
}
cin>>m;
while(m--)
{
set<string>s;
cin>>name1>>name2;
while(name1!="")
{
s.insert(name1);
name1=mp[name1];
}
bool flag=false;
while(name2!="")
{
if(s.find(name2)!=s.end())
{
flag=true;
break;
}
else name2=mp[name2];
}
if(!flag)cout<<-1<<endl;
else cout<<name2<<endl;
}
return 0;
}