题意:

N个点,形成一棵树,边有长度。

M个询问,每个询问(a,b),询问a和b的距离

思路:

模板题,看代码。DFS预处理算出每个结点离根结点的距离。

注意:

qhead[maxn],而不是qhead[maxm]。

输出用%I64d,不要用%lld。

C++ RE后 尝试用 G++交。

代码:

struct node{int to,w,next,lca;
};
int const maxn = 40005;
int const maxm = 205;
int fa[maxn];
int head[maxn], qhead[maxn];
int cnt1,cnt2;
ll d[maxn];
ll res[maxm*2];
bool vis[maxn];node edge[2*maxn];
node qedge[2*maxm];int n,m;int findFa(int x){return fa[x]==x?x:fa[x]=findFa(fa[x]);
}
inline void Addedge(int u,int v,int w){edge[++cnt1].w=w, edge[cnt1].to=v, edge[cnt1].next=head[u], head[u]=cnt1;edge[++cnt1].w=w, edge[cnt1].to=u, edge[cnt1].next=head[v], head[v]=cnt1;
}
inline void Addqedge(int u,int v){qedge[++cnt2].to=v, qedge[cnt2].next=qhead[u], qhead[u]=cnt2;qedge[++cnt2].to=u, qedge[cnt2].next=qhead[v], qhead[v]=cnt2;
}
void dfs(int u,int fa,ll w){d[u]=w;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v==fa) continue;dfs(v,u,w+edge[i].w);}
}
void Tarjan_LCA(int u){fa[u]=u, vis[u]=true;for(int i=head[u];i!=-1;i=edge[i].next){if(!vis[edge[i].to]){ //防止访问到父亲
            Tarjan_LCA(edge[i].to);fa[edge[i].to]=u;}}for(int i=qhead[u];i!=-1;i=qedge[i].next){if(vis[qedge[i].to]){qedge[i].lca=findFa(qedge[i].to);res[i]=d[u]+d[qedge[i].to]-2*d[qedge[i].lca];}}
}
void init(){rep(i,1,n) fa[i]=i;mem(head,-1);  mem(qhead,-1);  mem(vis,false);  mem(d,0);  mem(res,0);cnt1=cnt2=0;
}int T,a,b,w;
int main(){cin>>T;while(T--){scanf("%d%d",&n,&m);init();rep(i,1,n-1){scanf("%d%d%d",&a,&b,&w);;Addedge(a,b,w);}rep(i,1,m){scanf("%d%d",&a,&b);Addqedge(a,b);}dfs(1,-1,0);Tarjan_LCA(1);for(int i=1;i<=cnt2;i+=2){if(res[i])printf("%I64d\n",res[i]);elseprintf("%I64d\n",res[i+1]);}}
}

转载于:https://www.cnblogs.com/fish7/p/4006426.html

hdu 2586 How far away? (LCA模板)相关推荐

  1. HDU - 2586 How far away LCA+tanjar离线算法

    传送门 题意:求树上的两点的距离,放在一棵树上,而且题目提示只有一条,很明显是这条路线一定会经过他们的最近公共祖先啦,然后就是一个求距离的问题了.如果要采用离线算法的话,就是通过处理所有询问,那么肯定 ...

  2. HDU - 4547 CD操作(LCA模板)

    题目链接:点击查看 题目大意:给出一个层层嵌套的树状结构,可以从某一点通过一个操作直接到达任意一个子节点的位置,但如果要从某个节点到达其祖先节点需要一层一层往上爬,问若要从节点A到达节点B,需要多少步 ...

  3. LCA模板(数剖实现)

    题目链接:https://www.luogu.org/problemnew/show/P3379 题意:LCA模板题. 思路:今天开始学树剖,先拿lca练练.树剖解lca,两次dfs复杂度均为O(n) ...

  4. 51nod 2621 树上距离 (倍增+ LCA 模板)

    51nod 2621 树上距离 (倍增+ LCA 模板) 有一棵n个节点的无向树,每条边有一个边权,现在有q次询问,每次询问给出两个点,求这两个点之间的简单路径上的边权和是多少. 输入格式 第1行:两 ...

  5. *【HDU - 2586】How far away ? (LCA模板题,倍增)

    题干: There are n houses in the village and some bidirectional roads connecting them. Every day peole ...

  6. hdu 2586 How far away ?(LCA模板)(倍增法)

    在dfs的过程中维护三个数组:  deep[i],表示i点在树中的深度:  grand[x][i],表示x的第2^i个祖先的节点编号:  dis[x][i],表示x到它2^i祖 #include< ...

  7. HDU 2586 How far away ?【LCA】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意: 无向图,给定边及边权重,任意两点之间都有一条唯一的道路,道路上每个点只能出现一次.给定 ...

  8. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  9. hdu 2586(LCA + 节点间距离)

    题意:给一棵树,询问u和v之间的边权和. 解题思路:找到u和v的最近公共祖先,它们之间的距离为dis[u]+dis[v]-2*dis[lca(u,v)] #include<iostream> ...

最新文章

  1. Flutter 网络请求库http
  2. linux 中 timeval结构体 - Neddy11 - 博客园
  3. html5父子页面数据传递,使用iframe标签嵌套页面时 如何进行父子页面通讯/传值...
  4. php和python性能-Node.js与PHP、Python的字符处理性能对比
  5. EonerCMS——做一个仿桌面系统的CMS(十一)
  6. jdby mysql_06_dljd_mysql数据库常用操作
  7. vscode正则表达式替换php数组,vscode正则替换
  8. 昇腾AI处理器软件栈--张量加速引擎(TBE)
  9. SpaceX计划2022年完成52次发射
  10. 数据结构基础学习之(串与数组)
  11. 【OpenCV】矩阵掩模操作
  12. xmpppy获取服务器版本信息,为什么XMPP? - 今幕明的个人页面 - OSCHINA - 中文开源技术交流社区...
  13. android.dig机器人采访,机器人学导论心得 - osc_jjc36t9p的个人空间 - OSCHINA - 中文开源技术交流社区...
  14. 新浪微博批量删除微博方法
  15. [附源码]Python计算机毕业设计Django大学生考勤管理系统论文
  16. 股票-每日复盘-5-24
  17. 微信小程序编译不通过,报message:Error: app.json: app.json 未找到的错误
  18. 腾讯云 mysql 远程_腾讯云服务器 MySQL 远程连接设置
  19. 6.IT服务运营管理
  20. 数据骗子无处不在,教你拆穿所谓“万金油”

热门文章

  1. 云安全仍然是程序开发者头痛的问题
  2. 呼叫中心客服交流三大法宝
  3. 第四篇:new和delete的基本用法
  4. Javascript学习总结 - JS基础系列三
  5. xcode 证书生成、加载
  6. 用AJAX技术聚合RSS
  7. 如何测试Nginx的高性能
  8. javaScript通用数据类型校验2
  9. 网页中Flash播放器常用参数设置(转)
  10. ReactRouter的实现