• 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
    ",i,ans[i]);
    130     }
    131 }
  • 相关阅读:
    ASP.NET中JSON的序列化和反序列化
    C# 本地时间和GMT(UTC)时间的转换
    C# XmlReader/XmlWriter 类
    Xml 序列化
    XPath <第四篇>
    XML Schema <第三篇>
    .Net XML操作 <第二篇>
    XML基础<第一篇>
    Sql Server 面试题
    运用计划缓冲的建议
  • 原文地址:https://www.cnblogs.com/yijiull/p/6716519.html
Copyright © 2020-2023  润新知