zoukankan      html  css  js  c++  java
  • hiho15周离线lca

    它上面讲的很详细。

    http://hihocoder.com/problemset/problem/1067?sid=210395

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<vector>
    using namespace std;
    const int maxn = 111111;
    
    int father[maxn];
    struct Node
    {
        int next; int to;
    }e[maxn * 2];
    int len;
    int head[maxn];
    int color[maxn];
    int l[maxn]; int r[maxn];
    map<pair<int, int>, int> ans;
    vector<int> q[maxn];
    int getfather(int x)
    {
        if (x != father[x]) father[x] = getfather(father[x]);
        return father[x];
    }
    
    void un(int a, int b)
    {
        int fa = getfather(a); int fb = getfather(b);
        father[fb] = fa;
    }
    
    void add(int from, int to)
    {
        e[len].to = to;
        e[len].next = head[from];
        head[from] = len++;
    }
    
    void dfs(int x)
    {
        for (int i = head[x]; i != -1; i = e[i].next){
            int cc = e[i].to;
            dfs(cc);
            un(x, cc);
        }
        color[x] = 1;
        for (int i = 0; i < q[x].size(); i++){
            int t = q[x][i];
            if (color[t]){
                ans[make_pair(x, t)] = getfather(t);
                ans[make_pair(t, x)] = getfather(t);
            }
        }
    }
    
    int main()
    {
        string a, b;
    
        int n;
        map<string, int> m;
        map<int, string> m1;
        cin >> n;
        int k;
        int sum = 1;
        len = 0;
        memset(head, -1, sizeof(head));
        for (int i = 0; i < n; i++){
            cin >> a >> b; int c; int d;
            if (!m.count(a)) m[a] = sum, m1[sum] = a, sum++;
            if (!m.count(b)) m[b] = sum, m1[sum] = b, sum++;
            c = m[a]; d = m[b];
            add(c, d);
        }
        for (int i = 0; i<maxn; i++) father[i] = i;
        cin >> k;
        for (int i = 0; i < k; i++){
            cin >> a >> b;
            int c = m[a]; int d = m[b];
            l[i] = c; r[i] = d;
            q[c].push_back(d);
            q[d].push_back(c);
        }
        memset(color, 0, sizeof(color));
        dfs(1);
        for (int i = 0; i < k; i++){
            cout<<m1[ans[make_pair(l[i],r[i])]]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    sscanf()
    分享:Python字符编码详解
    STL priority_queue使用
    google maps 控件controller
    Google Maps Overlays叠加层
    java JDBC配置和使用
    转:总结java的interface和abstract class
    java 多线程 之 生产者和消费者
    一个简单的marker和infowindow
    java Nested Classes
  • 原文地址:https://www.cnblogs.com/yigexigua/p/4072674.html
Copyright © 2011-2022 走看看