简单高效的最近公共祖先问题c++实现

来源:互联网 发布:网络推动经济发展 编辑:程序博客网 时间:2024/05/16 13:13

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

#include "stdafx.h"#include <string>  #include <iostream>  #include <algorithm>  #include <map>  using namespace std;//这个的含义是,建立一个哈希表,键值是儿子//值为父亲,即将父亲和儿子的映射关键建立//注意一个父亲可以有多个孩子,因此将儿子作为键值,是一一对应的关系map<string, string> sf;//son,fathermap<string, int> vis;//判断是否已经访问int n, m;//要查找的两个孩子void find(string a, string b) {    vis.clear();    string tmp = a;    while (!tmp.empty()) //找出这个孩子的左右祖先 {        vis[tmp] = 1;//标记访问     //在哈希表中查找,如果他有父亲的话,则将父亲给temp        tmp = sf[tmp]; //在查找父亲的父亲    }                  //即完成了寻找这个孩子的所有祖先的问题    tmp = b;//将b孩子给temp,注意多了一个条件    while (!tmp.empty() && !vis[tmp]) //即只需要找到未标记到的即可        tmp = sf[tmp];//因为,如果已标记了的话,则一定是两个孩子的最近公共祖先    if (!tmp.empty())//如果不空的话,则输出这个祖先        cout << tmp << endl;    else cout << -1 << endl;}//测试int main() {    string a, b;    scanf("%d", &n);    sf.clear();    while (n--) {        cin >> a >> b;        sf[b] = a;    }    scanf("%d", &m);    while (m--) {        cin >> a >> b;        find(a, b);    }    return 0;}
0 0
原创粉丝点击