POJ 1470 Closest Common Ancestors

原题链接

题意:
最近公共祖先,给出一棵树和若干次询问,求对于每个点有多少次作为某询问的最近公共祖先。依次输出不为0次的点。

分析:
网上有个哥们总结得好啊,这题除了输入格式恶心,不知道根节点,询问数50W,而且对于两个点有可能有多次询问之外没有什么了 (-__-)b
看到输入觉得真是 呕~~ ,觉得用vector存起来比较省脑,结果TLE无数。改用普通数组之后就AC了(论vector的复杂度)
对于输入,呃呃,scanf改一改就好
对于根节点,自己求一下就好(入度为零)
对于超多的询问,用二维数组存放对于i和j的询问次数就好
对于可能询问一个点和他本身的LCA,不要无脑++就好
对了,算法是Tarjan

代码实现

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1000;    
int n,m,root,fa[maxn],cnt[maxn],que[maxn][maxn],in[maxn],v[maxn][maxn],ln[maxn];
/*each case has n points and m questions ,ans root is its root *fa -> father cnt ->how many times has the point been a LCA *que -> how many questions between i,j in -> has the point been visited *v ans ln -> my vector, ln is each v[]'s length */
bool ru[maxn];//used to computer the root
void dfs(int r){
    for(int i=0;i<ln[r];i++){
        dfs(v[r][i]);
        fa[v[r][i]]=r;
        in[v[r][i]]=1;
    }
    for(int i=1;i<=n;i++)
        if(que[r][i]&&in[i]){
            while(fa[i]!=fa[fa[i]])
                fa[i]=fa[fa[i]];
            cnt[fa[i]]+=que[r][i];
        }
}
int main(){
    while(scanf("%d",&n)!=EOF){
        memset(in,0,sizeof(in));
        memset(que,0,sizeof(que));
        memset(ru,0,sizeof(ru));
        memset(cnt,0,sizeof(cnt));
        memset(v,0,sizeof(v));
        memset(ln,0,sizeof(ln));
        for(int i=0,x,k;i<n;i++){
            scanf("%d:(%d)",&x,&k);
            for(int j=0,t;j<k;j++){
                scanf("%d",&t);
                v[x][ln[x]++]=t;
                ru[t]=true;
            }
        }
        scanf("%d",&m);
        for(int i=1,x,y;i<=m;i++){
            scanf(" (%d %d)",&x,&y);
            que[x][y]++;
            que[y][x]=que[x][y];
        }
        for(int i=1;i<=n;i++)
            if(!ru[i]){
                root=i;
                break;
            }
        for(int i=1;i<=n;i++)
            fa[i]=i;
        dfs(root);
        for(int i=1;i<=n;i++)
            if(cnt[i])
                printf("%d:%d\n",i,cnt[i]);
    }
    return 0;
}

English渣渣‘s 全英注释

By YOUSIKI

你可能感兴趣的:(POJ 1470 Closest Common Ancestors)