hdu - 2586 How far away ?(最短路共同祖先问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586

 

最近公共祖先问题~~LAC离散算法

题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起来,接下了有m次询问,每次询问两个房子a,b之间的距离是多少。

很明显的最近公共祖先问题,先建一棵树,然后求出每一点i到树根的距离dis[i],然后每次询问a,b之间的距离=dis[a]+dis[b]-2*dis[LCA(a,b)];

LCA(a,b)即是a,b的最近公共祖先。。

关于最近公共祖先,给大家推荐一个学长的博客http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html,里面讲的很不错!!

 

 1 # include<stdio.h>
 2 # include<string.h>
 3 # define N 40005
 4 # define M 205
 5 struct node{
 6     int from,to,next,val;
 7 }edge[2*N];
 8 struct node1{
 9     int from,to,next,num;
10 }edge1[2*M];
11 int tol,head[N],head1[N],tol1,father[N],dis[N],LCA[M],n,m;
12 bool visit[N];
13 void add(int a,int b,int c)
14 {
15     edge[tol].from=a;edge[tol].to=b;edge[tol].next=head[a];edge[tol].val=c;head[a]=tol++;
16 }
17 void add1(int a,int b,int c)
18 {
19     edge1[tol1].from=a;edge1[tol1].to=b;edge1[tol1].next=head1[a];edge1[tol1].num=c;head1[a]=tol1++;
20 }
21 int find(int x)
22 {
23     if(x!=father[x])
24         father[x]=find(father[x]);
25     return father[x];
26 }
27 void tarjan(int u)
28 {
29     int j,v;
30     visit[u]=1;
31     father[u]=u;
32     //
33     for(j=head1[u];j!=-1;j=edge1[j].next)
34     {
35         v=edge1[j].to;
36         if(visit[v]) LCA[edge1[j].num]=find(v);
37     }
38     //
39     for(j=head[u];j!=-1;j=edge[j].next)
40     {
41         v=edge[j].to;
42         if(!visit[v]) 
43         {
44             dis[v]=dis[u]+edge[j].val;
45             tarjan(v);
46             father[v]=u;
47         }
48     }
49 }
50 int main()
51 {
52     int i,ncase,a,b,c;
53     scanf("%d",&ncase);
54     while(ncase--)
55     {
56         scanf("%d%d",&n,&m);
57         tol=0;
58         memset(head,-1,sizeof(head));
59         for(i=1;i<n;i++)
60         {
61             scanf("%d%d%d",&a,&b,&c);
62             add(a,b,c);
63             add(b,a,c);
64         }
65         memset(visit,0,sizeof(visit));
66         tol1=0;
67         memset(head1,-1,sizeof(head1));
68         for(i=1;i<=m;i++)
69         {
70             scanf("%d%d",&a,&b);
71             add1(a,b,i);
72             add1(b,a,i);
73         }
74         ///LCA是一种离线算法,所以刚开始需要把所有的询问都输入,然后用邻接表进行存储,i表示第i次询问
75         dis[1]=0;
76         tarjan(1);
77         for(i=0;i<tol1;i+=2)
78         {
79             a=edge1[i].from;
80             b=edge1[i].to;
81             c=edge1[i].num;
82             printf("%d\n",dis[a]+dis[b]-2*dis[LCA[c]]);
83         }
84     }
85     return 0;
86 }

 

**************************

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6 
 7 const int NN=50010;
 8 
 9 int n,m;
10 vector<pair<int,int> > edge[NN],qe[NN];
11 vector<int> q1,q2;
12 
13 int p[NN];
14 int find(int x)
15 {
16     if (p[x]!=x) p[x]=find(p[x]);
17     return p[x];
18 }
19 
20 int sum=0,ans[NN],dis[NN];
21 bool vis[NN]={0};
22 void lca(int u,int fa)
23 {
24     p[u]=u;
25     for (int i=0; i<edge[u].size(); i++)
26     {
27         int v=edge[u][i].first;
28         if (v==fa) continue;
29         dis[v]=dis[u]+edge[u][i].second;
30         lca(v,u);
31         p[v]=u;
32     }
33     vis[u]=true;
34     if (sum==m) return;
35     for (int i=0; i<qe[u].size(); i++)
36     {
37         int v=qe[u][i].first;
38         if (vis[v])
39             ans[qe[u][i].second]=dis[u]+dis[v]-2*dis[find(v)];
40     }
41 }
42 
43 int main()
44 {
45     int u,v,w;
46 
47     int t;
48     scanf("%d",&t);
49     while(t--){
50     scanf("%d%d",&n,&m);
51     for (int i=1; i<=n; i++)
52     {
53         edge[i].clear();
54     }
55     for (int i=1; i<n; i++)
56     {
57         scanf("%d%d%d",&u,&v,&w);
58         edge[u].push_back(make_pair(v,w));
59         edge[v].push_back(make_pair(u,w));
60     }
61 
62     for (int i=0; i<m; i++)
63     {
64         scanf("%d%d",&u,&v);
65         qe[u].push_back(make_pair(v,i));
66         qe[v].push_back(make_pair(u,i));
67         ans[i]=0;
68     }
69     dis[1]=0;
70     lca(1,0);
71     for (int i=0; i<m; i++) printf("%d\n",ans[i]);
72     }
73     return 0;
74 }

 

转载于:https://www.cnblogs.com/weiyuan/p/5758012.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之添加固定图标到桌面

我的QQ群 1 需求 Android之添加固定图标到桌面 2 部分实现 在AndroidManifest.xml里面添加如下权限 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="com.android.launcher.perm…

想做程序员?不同方向入门路线全解

学习计算机编程有很多方向如果你没有一个正确的路线&#xff0c;那么就会&#xff1a; 就会跟上面所说的那样&#xff0c;被迫成为一个全栈&#xff0c;这是比较尴尬的。 若你想比较准确的针对某个方向学习&#xff0c;那就继续往下看吧。 一、程序员分为哪几个方向 随着…

【转】OpenGL超级宝典笔记——纹理映射Mipmap

原文地址 http://my.oschina.net/sweetdark/blog/177812 , 感谢作者&#xff0c;若非法转载请联系本人。 目录[-] MipmappingMipmap过滤构建Mip层Mipmaps 硬件生成LOD&#xff08;多细节层次&#xff09;偏好纹理对象管理多个纹理常驻纹理纹理优先级回顾Mipmapping Mipmap是一个…

【Microstation】第二章:Microstation三维建模基础知识

本章的主要内容包括模型的显示样式(线框、光滑)、三维定位(V、T、S、F)、Microstation常见的坐标系统(世界坐标系、ACS辅助坐标系、精确绘图坐标系、)和Microstation的工作区域(2D和3D)。 一、显示样式 二、三维定位 三维定位在Microstation中显得尤为重要,常见…

xtrabackup对MySQL数据库的备份及恢复教程

xtrabackup xtrabackup 是 percona 的一个开源项目&#xff0c;可以热备份innodb &#xff0c;XtraDB,和MyISAM&#xff08;会锁表&#xff09;。对MyISAM存储引擎会锁表&#xff0c;也是很郁闷的因为线上使用的是Innodb和MyISAM两种存储引擎&#xff0c;比较 头疼&#xff01;…

实现 EF Core 6 自定义查询标记

前言在《EF Core使用Simple Logging输出日志》中&#xff0c;我们介绍了查询标记 TagWith&#xff0c;它可以帮助我们快速定位到需要的日志&#xff1a;而在 .NET 6 中&#xff0c;新增了另外一个查询标记 TagWithCallSite&#xff0c;它可以标记出代码的位置&#xff1a;var u…

LeetCode: 14. Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings. 大意就是&#xff0c;写一个函数可以找到一个数组字符串中的最长前缀。 分析&#xff1a; 最长前缀的最大值为数组字符串中长度最短的字符&#xff0c;由最短字符串由后向前递减可以得…

jQuery选择器和选取方法

我们已经使用了带有简单Css选择器的jQuery选取函数:$()。现在是时候深入了解jQuery选择器语法&#xff0c;以及一些提取和扩充选中元素集的方法了。 一、jQuery选择器 在CSS3选择器标淮草案定义的选择器语法中&#xff0c;jQuery支持相当完整的一套子集&#xff0c;同时还添加了…

0运维?微信小程序云开发增删查改【05】

在创建小程序时&#xff0c;选择云开发&#xff1a; 随后进入项目之后&#xff0c;此时整个目录如下&#xff1a; 此时我们如图目录即可找到首页位置&#xff1a; 接着咱们清除 index.wxml 代码内容&#xff1a; 在 index.wxml 中加入如下代码&#xff1a; <view> …

Android之解决卸载app后再次安装提示room数据库错误

1、问题 目前只有一个google手机之前安装了app,里面有room写的数据库&#xff0c;后面把app卸载了&#xff0c;再次安装新的app(修改了数据库里面的字段)&#xff0c;启动奔溃。 2、分析 提示数据库错误&#xff0c;很明显就像以前的app里面的数据库没有删除一样&#xff0c;…

【Microstation】第三章:Microstation三维模型构建与编辑

本章主要讲述三维基本实体绘制、三维构造元素绘制、三维模型编辑。 一、三维基本体素绘制 对于立方体、圆柱、球、圆锥等这些基本立体单位,MS提供了专门的绘图工具。 基本体素绘制有两种方式: (1)精确绘图工具 (2&

文件系统管理相关命令

查看文件系统相关属性的命令&#xff1a;blkidblkid是一个查看磁盘设备属性相关信息的命令行工具blkid -L LABEL | UUID :根据UUID查看对应的设备是哪个blkid [-ghlv] [-c file] [-w file] [-o format][-s tag] [-t NAMEvalue] device [device ...]-i&#xff1a;显示io限制lsb…

CSharpFunctionalExtensions -函数式编程C#的功能扩展

简介该库有助于以更实用的方式编写代码安装在NuGet上可用dotnet add package CSharpFunctionalExtensions或者PM> Install-Package CSharpFunctionalExtensions例子Maybe创建一个值Maybe<string> apple Maybe<string>.From("apple");// orMaybe<s…

Android之实现夸克浏览器书签和历史页面滑动时候右上角图标切换效果

1 需求 实现夸克浏览器书签和历史页面滑动时候右上角图标切换效果,页面滑动的时候,图标也左右滑动,但是只是显示其中的一个 https://www.captainai.net/st/ 2 代码实现 xml布局实现 <LinearLayoutandroid:id="@+id/mainLl"android:layout_width="24d…

ArcGIS 10.6字段计算器(Field Calculator)字段任意填充编码序列(奇数、偶数序列、自定义间隔)

有关ArcGIS 10.x中属性数据采集和字段计算器(Field Calculator)的文章,需要的读者可以参照: 《ArcGIS实验教程——实验四:数字化属性数据的采集》,文章中就属性数据采集的多种方式做了说明,其中就有字段计算器的详细说明;《【ArcGIS风暴】ArcGIS 10.2字段计算器(Field…

你都用 Python 来做什么?

你们都用python做些什么呢&#xff1f; 在开发中 python 这一个语言就像是小叮当&#xff0c;而 python 的第三方库则是“百宝箱”&#xff0c;你只要想着对某一个方向进行开发&#xff0c;那么这个“百宝箱”就会给你想要的东西。 由于我是在开发多年后接触到的 python&#…

DOS分区概述

虽然很多参考文档对DOS分区进行介绍&#xff0c;但一直没有一个统一的标准&#xff0c;也没有统一的命名规则。Microsoft将使用DOS分区体系的磁盘称为“主引导记录(Master Boot Recorder---MBR)磁盘”&#xff0c;这是相对于使用“全局ID分区表(GUID Partition Table---GPT)磁盘…

pdf.js 利用HTML5技术显示pdf内容

Mozilla实验室最近在github上开源了一款js库pdf.js&#xff0c;用来读取PDF文件。 http://mozilla.github.io/pdf.js/ Using base64 encoded PDF HTML页面内容 <script src"//mozilla.github.io/pdf.js/build/pdf.js"></script><h1>PDF.js Hell…

.NET 对于构建系统应用的探索历程

这篇文章介绍和梳理一下截止到 2022 年的 .NET 向系统编程探索的历程。2003 年的 Singularity 项目试图让 Windows 的内核态与用户态应用完全建立在 .NET 托管世界上&#xff0c;并试验了一个支持编译到本机代码的类似 C# 的语言&#xff0c;并发布了很多相关的论文。后来 Sing…

Android之tint图片着色器

1、爆照 上面是原图,下面是点击效果。 2、介绍 设置着色模式用的。这个模式共有6种,分别为: multiply screen src_in(默认) src_over src_atop add android:tint 属性可以改变图片颜色 3 源代码 colors.xml <?xml version="1.0" encoding="utf-8&qu…