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

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

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

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

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

求三次取最优就行了。

 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 using namespace std;
 ;
 struct node{
     int to,next;
 }e[];
 int sum,n,m,tot,logn,l,r,a,b,c,x,y,id;
 ],dep[maxn];

 void insert(int u, int v, int c){
     e[++tot].to=v;
     //e[tot].cost=c;
     e[tot].next=head[u];
     head[u]=tot;
 }

 void dfs(int u, int f, int d){
     dep[u]=d;
     fa[u][]=f; //dis[u][0]=c;
     ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];
     //for (int i=1; i<=logn; i++) dis[u][i]=dis[u][i-1]+dis[fa[u][i-1]][i-1];
     ; i=e[i].next)
         if (e[i].to!=f)
             dfs(e[i].to,u,d+);
 }

 int lca(int u, int v){
     if (dep[u]>dep[v]) swap(u,v);
     while (dep[u]<dep[v]){
         ; i--)
             if (dep[u]<dep[fa[v][i]]){
                 //sum+=dis[v][i];
                 v=fa[v][i];
             }
         //sum+=dis[v][0];
         v=fa[v][];
     }
     if (u==v) return u;
     ; i--)
         if (fa[u][i]!=fa[v][i]){
         //    sum+=dis[v][i]+dis[u][i];
             u=fa[u][i]; v=fa[v][i];
         }
     //sum+=dis[v][0]+dis[u][0];
     u=fa[u][]; v=fa[v][];
     return u;
 }

 int main(){
     scanf("%d%d", &n, &m);
     tot=-;
     ; i<=n; i++) head[i]=-;
      //memset(head,-1,sizeof(head));
     //memset(dis,0,sizeof(dis));
     //memset(e,0,sizeof(e));
     ; i<n; i++){
         scanf("%d%d", &l, &r);
         insert(l,r,);
         insert(r,l,);
     }
     logn=;
     <<logn)<n) logn++;
     dfs(,,);
     ; i<=m; i++){
         scanf("%d%d%d", &a, &b, &c);
         ;
         x=lca(a,b); y=lca(x,c);
         sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*;
         if (sum<ans){
             ans=sum;
             id=x;
         }
         x=lca(a,c); y=lca(x,b);
         sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*;
         if (sum<ans){
             ans=sum;
             id=x;
         }
         x=lca(b,c); y=lca(x,a);
         sum=dep[a]+dep[b]+dep[c]-dep[x]-dep[y]*;
         if (sum<ans){
             ans=sum;
             id=x;
         }
         printf("%d %d\n", id, ans);
     }
     ;
 }

bzoj1832: [AHOI2008]聚会--LCA的更多相关文章

  1. bzoj1787[Ahoi2008]Meet 紧急集合&bzoj1832[AHOI2008]聚会

    bzoj1787[Ahoi2008]Meet 紧急集合 bzoj1832[AHOI2008]聚会 题意: 给个树,每次给三个点,求与这三个点距离最小的点. 题解: 倍增求出两两之间的LCA后,比较容易 ...

  2. bzoj1832: [AHOI2008]聚会

    写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  3. BZOJ 1832: [AHOI2008]聚会( LCA )

    LCA模板题...不难发现一定是在某2个人的LCA处集合是最优的, 然后就3个LCA取个最小值就OK了. 距离就用深度去减一减就可以了. 时间复杂度O(N+MlogN) (树链剖分) -------- ...

  4. 题解 [BZOJ1832][AHOI2008] 聚会

    题面 解析 首先对于其中的两个点\(x,y\)最近的点显然就是他们的\(lca\)(我们把它设为\(p1\)), 然后考虑第三个点\(z\)与\(p1\)的\(lca,p2\). 有以下几种情况: \ ...

  5. P4281 [AHOI2008]紧急集合 / 聚会[LCA]

    解析 蒟蒻用的办法比较蠢,不如上面的各位大佬,直接化成一个式子了,我还是分类讨论做的. 下面正文. 猜想:最优集合点一定是三点任意两对点对应的路径的交点. 不妨这样想,如果任意两个人经过同一条路径,那 ...

  6. LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)

    传送门 解题思路 可以通过手玩或打表发现,其实要选的点一定是他们三个两两配对后其中一对的$lca$上,那么就直接算出来所有的$lca$,比较大小就行了. #include<iostream> ...

  7. bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1841  Solved: 857[Submit][ ...

  8. 【BZOJ】1832: [AHOI2008]聚会

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1832 省选出出了CF的感觉..... 显然一发贪心,如果两个点显然就是他们的$LCA$(不 ...

  9. bzoj 1832: [AHOI2008]聚会

    良心题2333 三个点两两求一遍就行,最小肯定是在某2个点的lca处,(肯定让第三个人去找2个人,不能让2个人一起去找第三个人233) #include<bits/stdc++.h> #d ...

随机推荐

  1. 【tomcat 无法部署】svn上下载的maven项目无法部署到tomcat中

    问题: svn上下载的maven项目无法部署到tomcat中,tomcat不识别项目,但是这个项目确实是web项目 发现的过程: 然后依次产看项目的编译版本: 项目的依赖架包: 才发现: 解决方法: ...

  2. 【jQuery 区别】.click()和$(document).on("click","指定的元素",function(){});的区别

    给出以下的代码展示: //绑定 下一页 的点击事件 $("a[aria-label='Next']").click(function(){ $("a[aria-label ...

  3. 【前台页面 BUG】回车按钮后,页面自动跳转

    点击回车按钮后,页面自动的迅速跳转 原因: 表单隐式提交了. 解决方法: 在方法执行完成后,加上return false; 代码如下: /** * 注册按钮的点击事件 */ $("#regi ...

  4. td 的colspan属性

    看来要长长记性了,这个问题上次遇到过这次又犯了这个错. <table> <tr> <td colspan="10"> </td> & ...

  5. JavaScript入门(2)

    encodeURI()和 decodeURI()作用  编码与解码 encodeURIComponent()和 decodeURIComponent()作用区别是  后者可以处理一些特殊字符进行转义 ...

  6. 【Oracle】ORA-00257:archiver error. Connect internal only, until freed 错误的处理方法

    archive log 日志已满ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法 1. 用sys用户登录  s ...

  7. ubuntu下命令行禁用笔记本触摸板

    机房电脑不好用,所以用笔记本,但是由于笔记本过分紧凑手经常让鼠标不知道跑哪里去.于是找到了这两个命令 禁用:sudo rmmod psmouse 启用:sudo modprobe psmouse 非常 ...

  8. ACM: hihicoder #1174 : 拓扑排序·一 STL- queue

    #1174 : 拓扑排序·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选 ...

  9. CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路

    描述 灾后重建(rebuild)  B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两 ...

  10. Kosaraju 算法

    Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一 ...