poj1470(LCA模板题)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1470(LCA模板题)相关的知识,希望对你有一定的参考价值。

题目连接:http://poj.org/problem?id=1470

被输入卡到死。。。。。。

开始也看到输入格式的问题了,但是我以为查询的两个点的格式就是(u v)这样,其它地方可以无限空格。。。

为这一直WA啊,以为是算法哪块写挂了,一直找。。。。。

其实哪都可能有一堆空格(其实题目说的也很清楚了-_-||)。。。。

教训。。

还有一点,刚开始以为给出的第一个节点就是祖先,其实题目并没有这么说,看着图理解就误以为了那样了。。。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<algorithm>
  5 using namespace std;
  6 
  7 const int maxn=920;
  8 
  9 int first[maxn<<1],node[maxn<<1],dep[maxn<<1],dp[maxn<<1][25];
 10 int ans[maxn];
 11 int vis[maxn];
 12 
 13 struct edge
 14 {
 15     int v,nex;
 16 }e[maxn];
 17 
 18 int head[maxn];
 19 int cnt=0;
 20 int tot=0;
 21 int in[maxn];
 22 void add(int u,int v)
 23 {
 24     e[cnt].v=v;
 25     e[cnt].nex=head[u];
 26     head[u]=cnt++;
 27 }
 28 
 29 void dfs(int u,int d)
 30 {
 31     tot++;
 32     node[tot]=u;
 33     dep[tot]=d;
 34     vis[u]=1;
 35     first[u]=tot;
 36     for(int i=head[u];i!=-1;i=e[i].nex) if(!vis[e[i].v])
 37     {
 38         dfs(e[i].v,d+1);
 39         tot++;
 40         node[tot]=u;
 41         dep[tot]=d;
 42     }
 43 }
 44 
 45 void RMQ_INIT(int  n)
 46 {
 47     int k=log2(n);
 48     for(int i=1;i<=n;i++) dp[i][0]=i;
 49     for(int j=1;j<=k;j++)
 50         for(int i=1;i+(1<<j)-1<=n;i++)
 51     {
 52         int a=dp[i][j-1];
 53         int b=dp[i+(1<<j-1)][j-1];
 54         if(dep[a]<dep[b]) dp[i][j]=a;
 55         else dp[i][j]=b;
 56     }
 57 }
 58 
 59 int rmq(int x,int y)
 60 {
 61     int k=log2(y-x+1);
 62     int a=dp[x][k];
 63     int b=dp[y-(1<<k)+1][k];
 64     if(dep[a]<dep[b]) return a;
 65     return b;
 66 }
 67 int lca(int a,int b)
 68 {
 69     int x=first[a];
 70     int y=first[b];
 71     int k;
 72     if(x<=y)
 73     {
 74         k=rmq(x,y);
 75         return node[k];
 76     }
 77     else
 78     {
 79         k=rmq(y,x);
 80         return node[k];
 81     }
 82 }
 83 int main()
 84 {
 85     int n,q;
 86     while(scanf("%d",&n)!=EOF)
 87     {
 88         memset(ans,0,sizeof(ans));
 89         memset(vis,0,sizeof(vis));
 90         memset(head,-1,sizeof(head));
 91         memset(in,0,sizeof(in));
 92         tot=0;
 93         cnt=0;
 94         int m;
 95         int u,v;
 96         for(int i=0;i<n;i++)
 97         {
 98             scanf("%d:(%d)",&u,&m);
 99             for(int j=0;j<m;j++)
100             {
101                 scanf("%d",&v);
102                 in[v]++;
103                 add(u,v);
104               //  add(v,u);
105             }
106         }
107         for(int i=1;i<=n;i++) if(!in[i])
108         dfs(i,1);
109      //   for(int i=0;i<=tot;i++)
110      //       printf("%d ",node[i]);
111      //      puts("");
112         RMQ_INIT(tot);
113         scanf("%d",&q);
114         char f[3],g[3];
115         while(q--)
116         {
117             /* 错误读入方式示范。。。
118             scanf("%s%s",f,g);
119             u=f[1]-‘0‘;
120             v=g[0]-‘0‘;
121             */
122             while(getchar()!=() ;
123             scanf("%d%d",&u,&v);
124             int h=lca(u,v);
125             ans[h]+=1;
126             while(getchar()!=));
127         }
128         for(int i=1;i<=n;i++)
129             if(ans[i]) printf("%d:%d\n",i,ans[i]);
130     }
131 }

 

以上是关于poj1470(LCA模板题)的主要内容,如果未能解决你的问题,请参考以下文章

poj1470 LCA倍增法

专题训练之LCA

POJ 1470 Closest Common Ancestors LCA

POJ 1330(LCA模板)

POJ 1330 Nearest Common Ancestors (模板题) (LCA)倍增

poj1986 LCA转化为RMQ在线算法模板题