zoukankan      html  css  js  c++  java
  • hdu4547 lca tarjan

    比较直接。

    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define INF 99999999
    #define ll __int64
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define mod 1000000007
    using namespace std;
    const int MAXN = 100010;
    struct node
    {
        int to;
        int next;
    }edge[MAXN*2];
    struct Node
    {
        int to;
        int lca;
        int num;
        int next;
    }a[MAXN*2];
    int pa[MAXN],ac[MAXN],pre[MAXN],vis[MAXN],ind,num[MAXN],ind1,pre1[MAXN],in[MAXN];
    int n,m,lca[MAXN];
    string s1[MAXN],s2[MAXN];
    map<string,int>mp;
    void add(int x,int y)
    {
        edge[ind].to = y;
        edge[ind].next = pre[x];
        pre[x] = ind ++;
    }
    void Add(int x,int y,int num)
    {
        a[ind1].num = num;
        a[ind1].to = y;
        a[ind1].next = pre1[x];
        pre1[x] = ind1 ++;
    }
    int find(int x)
    {
        if(x != pa[x])
            pa[x] =find(pa[x]);
        return pa[x];
    }
    void dfs(int rt,int d)
    {
        int i;
        vis[rt] = 1;
        ac[rt] = rt;
        num[rt] = d;
        for(i=pre[rt]; i!=-1; i=edge[i].next){
            int t = edge[i].to;
            if(!vis[t]){
                dfs(t,d+1);
                int fx = find(rt);
                int fy = find(t);
                if(fx != fy){
                    pa[fy] = fx;
                    ac[t] = fx;
                }
            }
        }
        for(i=pre1[rt]; i!=-1; i=a[i].next){
            int t = a[i].to;
            if(vis[t]){
                int fp = ac[find(t)];
                a[i].lca = fp;
                a[i^1].lca = fp;
                lca[a[i].num] = fp;
            }
        }
    }
    int main()
    {
        int i,t,cnt;
        cin>>t;
        while(t--)
        {
            cnt = 0;
            ind = 0;
            memset(pre,-1,sizeof(pre));
            memset(ac,0,sizeof(0));
            memset(in,0,sizeof(in));
            scanf("%d%d",&n,&m);
            for(i=1; i<=n; i++){
                pa[i] = i;
                num[i] = 1;
            }
            mp.clear();
            for(i=1; i<n; i++){
                string ss1,ss2;
                cin>>ss1>>ss2;
                if(!mp[ss1])
                    mp[ss1] = ++cnt;
                if(!mp[ss2])
                    mp[ss2] = ++cnt;
                add(mp[ss2],mp[ss1]);
                add(mp[ss1],mp[ss2]);
                in[mp[ss1]]++;
            }
            ind1 = 0;
            memset(pre1,-1,sizeof(pre1));
            memset(vis,0,sizeof(vis));
            for(i=1; i<=m; i++){
                cin>>s1[i]>>s2[i];
                Add(mp[s1[i]],mp[s2[i]],i);
                Add(mp[s2[i]],mp[s1[i]],i);
            }
            for(i=1; i<=cnt; i++){
                if(!in[i]){
                    break;
                }
            }
            dfs(i,0);
            for(i=1; i<=m; i++){
                int ans = 0;
                ans = num[mp[s1[i]]] - num[lca[i]];
                if(lca[i] != mp[s2[i]])
                    ans++;
                if(mp[s1[i]] == mp[s2[i]]){
                    ans = 0;
                }
                cout<<ans<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    350 Intersection of Two Arrays II 两个数组的交集 II
    349 Intersection of Two Arrays 两个数组的交集
    347 Top K Frequent Elements 前K个高频元素
    345 Reverse Vowels of a String 反转字符串中的元音字母
    344 Reverse String 反转字符串
    343 Integer Break 整数拆分
    342 Power of Four 4的幂
    338 Counting Bits Bit位计数
    Java常见面试题之Forward和Redirect的区别
    字节、字、bit、byte的关系
  • 原文地址:https://www.cnblogs.com/sweat123/p/5201053.html
Copyright © 2011-2022 走看看