hihoCoder #1062 : 最近公共祖先·一

 

题意:提供一棵家族树,询问离两人最近的公共祖先。

思路:看大神代码得知此思路。用map保存儿子到父亲的映射,查询时,两人共同回溯到根,中间相遇的那个节点就是答案了。先用其中一个来回溯到根,记录路径上的节点为访问过,再用另一个来回溯到根,期间只要第一次碰到已经访问过的节点,就是答案。

 

 1 #include <iostream>

 2 #include <map>

 3 #include <cstdio>

 4 #include <string>

 5 using namespace std;

 6 map<string,string> sontofar;

 7 map<string,int> vis;

 8 

 9 void check(string tmp1,string tmp2)

10 {

11     vis.clear();

12     string ind=tmp1;

13     while( !ind.empty() )

14     {

15         vis[ind]=1;

16         ind=sontofar[ind];        //找不到就是空了

17     }

18 

19     ind=tmp2;

20     while( !ind.empty() && vis[ind]==0 )

21         ind=sontofar[ind];

22 

23     if(ind.empty())

24         cout<<"-1"<<endl;

25     else

26         cout<<ind<<endl;

27 }

28 

29 int main()

30 {

31     //freopen("input.txt","r",stdin);

32     int t, p=0;

33     string tmp1, tmp2;

34 

35     cin>>t;

36     while(t--)

37     {

38         cin>>tmp1>>tmp2;

39         sontofar[tmp2]=tmp1;

40     }

41 

42     cin>>t;

43     while(t--)

44     {

45         cin>>tmp1>>tmp2;

46         check(tmp1,tmp2);

47     }

48     return 0;

49 }
AC代码

 

你可能感兴趣的:(code)