hihoCoder week13 最近公共祖先·一

用的dfs,自下往上搜索一个节点的所有祖先,然后在相应祖先 判断是否是另一个节点的祖先,如果是 就截止,否则继续往上搜索,直到搜索到,或者知道所有的祖先都被扫描完成

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;

int n;
int cnt, tot;
map<string ,int> mp;
string s[N];

vector<int> son[N], fa[N];
string s1, s2;

int getId(string str)
{
    if(mp[str]) {
        return mp[str];
    }
    mp[str] = (++cnt);
    s[cnt] = str;
    return cnt;
}

int dfs(int u, int v) {
    if(u == v) return true;
    for(int i=0; i<son[u].size(); i++) {
        int x = son[u][i];
        //cout << s[x] <<" ";
        if(dfs(son[u][i], v)) {
            return true;
        }
    }
    //cout<<"\n";
    return false;
}

int main()
{
    freopen("in.txt","r",stdin);
    scanf("%d", &n);
    for(int i=1; i<=n; i++) {
        cin >> s1 >> s2;
        int u = getId(s1);
        int v = getId(s2);
        son[u].push_back(v);
        fa[v].push_back(u);
    }
    int m; scanf("%d",&m);
    while(m--) {
        cin >> s1 >> s2;
        int u = getId(s1);
        int v = getId(s2);
        // cout <<u <<" "<< v<<"\n";
        bool flag=0;
        queue<int> que;
        que.push(u);
        while(!que.empty()) {
            int tmp=que.front(); que.pop();
            //cout << s[tmp]<<"\n";
            for(int i=0; i<fa[tmp].size(); i++) {
                que.push(fa[tmp][i]);
            }
            if(dfs(tmp,v)) {
                flag = true;
                cout << s[tmp] <<endl;
                break;
            }
        }
        if(!flag)
            puts("-1");

    }
    return 0;
}

原文地址:https://www.cnblogs.com/Draymonder/p/10007484.html

时间: 2024-10-16 06:34:35

hihoCoder week13 最近公共祖先·一的相关文章

[ACM] hihocoder 1062 最近公共祖先&#183;一 (一般做法)

描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? "为什么呢?"小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边. "嘿嘿,小Hi,你快过来看!"小Ho招呼道. "你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来--什么!我们居然有同一个祖祖祖祖祖爷爷?" "诶,真是诶--这个网

hihocoder #1062 : 最近公共祖先&#183;一(小数据量 map+set模拟+标记检查 *【模板】思路 )

#1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? “为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边. “嘿嘿,小Hi,你快过来看!”小Ho招呼道. “你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有同

hihoCoder 1062 最近公共祖先&#183;一 最详细的解题报告

题目来源:最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 题目描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? “为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边. “嘿嘿,小Hi,你快过来看!”小Ho招呼道. “你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有同一

hihoCoder - 1062 - 最近公共祖先&#183;一 (树的最近公共祖先问题!)

#1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? "为什么呢?"小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边. "嘿嘿,小Hi,你快过来看!"小Ho招呼道. "你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询

hihoCoder #1067 : 最近公共祖先&#183;二 [ 离线LCA tarjan ]

传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁.远在美国的他们利用了一些奇妙的技术获得了国内许多人的相关信息,并且搭建了一个小小的网站来应付来自四面八方的请求. 但正如我们所能想象到的……这样一个简单的算法并不能支撑住非常大的访问量,所以摆在小Hi和小Ho面前的无非两种选择: 其一是

hihoCoder#1062(最近公共祖先一)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? “为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边. “嘿嘿,小Hi,你快过来看!”小Ho招呼道. “你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有同一个祖祖祖祖祖爷爷?” “诶,真是

hihoCoder#1067 最近公共祖先&#183;二

原题地址 超时.超内存都碰到了..最后还是参考了这篇博文才勉强AC 需要注意: 1. 肯定是树而不是森林,而且树的根节点一定是第一个出现的名字,所以不需要再去找哪个是根了.这样可以节省一部分内存. 2. 用并查集路径压缩的方法维护并查集结构即可,当查找的时候再压缩,不需要每次染黑节点的时候都压缩.这样可以节省一部分时间. 3. 字符串都转成id再做. 4. 能静态申请内存就尽量用静态内存,比如数组,STL少用,尤其是map,效率极低. 代码: 1 #include <iostream> 2 #

hihoCoder#1062 最近公共祖先&#183;

原题地址 A和A的共同祖先是A,即使A没有在之前的家谱中出现过!被这个坑了,WA了很久... 比如:小头爸爸是大头儿子他爹,问:隔壁王叔叔和隔壁王叔叔的最近祖先是谁?,答:隔壁王叔叔. 代码: 1 #include <iostream> 2 #include <map> 3 #include <set> 4 #include <string> 5 6 using namespace std; 7 8 int main() { 9 int N, M; 10 m

hihoCoder#1069 最近公共祖先&#183;三

原题地址 根据提示用Spase Table做 将Tree先展成List,因为数组长度等于边数的2倍,树中边数等于节点数-1,所以List数组只要开2倍节点数大小即可 WA了几次,原来是查询的时候出现左边界大于右边界的情况,所以这种情况要颠倒一下 代码: 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <map> 5 6 using namespace std;