zoukankan      html  css  js  c++  java
  • bzoj1832: [AHOI2008]聚会--LCA

    本来觉得这是一道挺水的题目,后来觉得出题人挺变态的= =

    半个小时敲完后,内存超限它给我看TLE,还是0ms,后来才发现内存限制64m

    然后卡了一个小时后AC了。。

    题目大意是在一棵树上找三点的最短路

    依次挑两个点求LCA,再将LCA与第三个点再求LCA

    求三次取最优就行了。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn = 500010;
     6 struct node{
     7     int to,next;
     8 }e[1000010];
     9 int sum,n,m,tot,logn,l,r,a,b,c,x,y,id;
    10 int head[maxn],fa[maxn][21],dep[maxn];
    11 
    12 void insert(int u, int v, int c){
    13     e[++tot].to=v;
    14     //e[tot].cost=c;
    15     e[tot].next=head[u];
    16     head[u]=tot;
    17 }
    18 
    19 void dfs(int u, int f, int d){
    20     dep[u]=d;
    21     fa[u][0]=f; //dis[u][0]=c;
    22     for (int i=1; i<=logn; i++) fa[u][i]=fa[fa[u][i-1]][i-1];
    23     //for (int i=1; i<=logn; i++) dis[u][i]=dis[u][i-1]+dis[fa[u][i-1]][i-1];
    24     for (int i=head[u]; i!=-1; i=e[i].next)
    25         if (e[i].to!=f)
    26             dfs(e[i].to,u,d+1);
    27 }
    28 
    29 int lca(int u, int v){
    30     if (dep[u]>dep[v]) swap(u,v);
    31     while (dep[u]<dep[v]){
    32         for (int i=logn; i>=0; i--)
    33             if (dep[u]<dep[fa[v][i]]){
    34                 //sum+=dis[v][i];
    35                 v=fa[v][i];
    36             }
    37         //sum+=dis[v][0];
    38         v=fa[v][0];
    39     }
    40     if (u==v) return u;
    41     for (int i=logn; i>=0; i--)
    42         if (fa[u][i]!=fa[v][i]){
    43         //    sum+=dis[v][i]+dis[u][i];
    44             u=fa[u][i]; v=fa[v][i];
    45         }
    46     //sum+=dis[v][0]+dis[u][0];
    47     u=fa[u][0]; v=fa[v][0];
    48     return u;
    49 }
    50 
    51 int main(){
    52     scanf("%d%d", &n, &m);
    53     tot=-1;
    54     for (int i=1; i<=n; i++) head[i]=-1;
    55      //memset(head,-1,sizeof(head));
    56     //memset(dis,0,sizeof(dis));
    57     //memset(e,0,sizeof(e));
    58     for (int i=1; i<n; i++){
    59         scanf("%d%d", &l, &r);
    60         insert(l,r,1);
    61         insert(r,l,1);
    62     }
    63     logn=0;
    64     while ((1<<logn)<n) logn++;
    65     dfs(1,0,1);
    66     for (int i=1; i<=m; i++){
    67         scanf("%d%d%d", &a, &b, &c);
    68         int ans=1000001000;
    69         x=lca(a,b); y=lca(x,c);
    70         sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*2;
    71         if (sum<ans){
    72             ans=sum;
    73             id=x;
    74         }
    75         x=lca(a,c); y=lca(x,b);
    76         sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*2;
    77         if (sum<ans){
    78             ans=sum;
    79             id=x;
    80         }
    81         x=lca(b,c); y=lca(x,a);
    82         sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*2;
    83         if (sum<ans){
    84             ans=sum;
    85             id=x;
    86         }
    87         printf("%d %d
    ", id, ans);
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    django---url---03
    django---url---02
    django--url---路由分配3种情况
    pycharm导入.py文件报错
    django 常见环境问题
    python+appium+unittest 启动一次app,执行多条test
    查找夜神模拟器app的安装包
    Android_smali_代码注入
    vue uuid的使用
    vue_elementui_tab刷新保持当前状态
  • 原文地址:https://www.cnblogs.com/mzl0707/p/5471341.html
Copyright © 2011-2022 走看看