HDU ACM 2586 How far away ?LCA->并查集+Tarjan(离线)算法
题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w。有m次询问,每次询问房子a,b之间的距离是多少。
分析:近期公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次询问a。b之间的距离=d[a]+d[b]-2*d[LCA(a,b)];LCA(a,b)是a,b的近期公共祖先。
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #include<iostream>
- #include<vector>
- using namespace std;
- #define N 50005
- vector<int> map[N],w[N],query[N],num[N];
- int p[N],d[N],res[N];
- bool vis[N];
- int n;
- void Init()
- {
- int i;
- for(i=1;i<=n;i++)
- {
- map[i].clear();
- w[i].clear();
- query[i].clear();
- num[i].clear();
- p[i]=i;
- d[i]=0;
- vis[i]=false;
- }
- }
- int Find(int x)
- {
- if(p[x]!=x)
- p[x]=Find(p[x]);
- return p[x];
- }
- void Union(int x,int y)
- {
- x=Find(x);
- y=Find(y);
- if(x!=y)
- p[y]=x;
- }
- void Tarjan(int cur,int v)
- {
- int size,i,tmp;
- vis[cur]=true;
- d[cur]=v;
- size=map[cur].size();
- for(i=0;i<size;i++)
- {
- tmp=map[cur][i];
- if(vis[tmp]) continue;
- Tarjan(tmp,v+w[cur][i]);
- Union(cur,tmp);
- }
- size=query[cur].size();
- for(i=0;i<size;i++)
- {
- tmp=query[cur][i];
- if(!vis[tmp])continue;
- res[num[cur][i]]=d[cur]+d[tmp]-2*d[Find(tmp)];
- }
- }
- int main()
- {
- int T,q,a,b,c,i;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&q);
- Init();
- for(i=1;i<n;i++)
- {
- scanf("%d%d%d",&a,&b,&c);
- map[a].push_back(b);
- w[a].push_back(c);
- map[b].push_back(a);
- w[b].push_back(c);
- }
- for(i=0;i<q;i++)
- {
- scanf("%d%d",&a,&b);
- query[a].push_back(b);
- query[b].push_back(a);
- num[a].push_back(i);
- num[b].push_back(i);
- }
- Tarjan(1,0);
- for(i=0;i<q;i++)
- printf("%d\n",res[i]);
- }
- return 0;
- }
HDU ACM 2586 How far away ?LCA->并查集+Tarjan(离线)算法的更多相关文章
- LCA最近公共祖先(Tarjan离线算法)
这篇博客对Tarjan算法的原理和过程模拟的很详细. 转载大佬的博客https://www.cnblogs.com/JVxie/p/4854719.html 第二次更新,之前转载的博客虽然胜在详细,但 ...
- LCA(最近公共祖先)--tarjan离线算法 hdu 2586
HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- LCA问题的ST,tarjan离线算法解法
一 ST算法与LCA 介绍 第一次算法笔记这样的东西,以前学算法只是笔上画画写写,理解了下,刷几道题,其实都没深入理解,以后遇到新的算法要把自己的理解想法写下来,方便日后回顾嘛>=< R ...
- 最近公共祖先LCA Tarjan 离线算法
[简介] 解决LCA问题的Tarjan算法利用并查集在一次DFS(深度优先遍历)中完成所有询问.换句话说,要所有询问都读入后才开始计算,所以是一种离线的算法. [原理] 先来看这样一个性质:当两个节点 ...
- LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现
首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵 ...
- Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)
Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...
- HDU 3081 Marriage Match II (二分图,并查集)
HDU 3081 Marriage Match II (二分图,并查集) Description Presumably, you all have known the question of stab ...
- hdu 2586(Tarjan 离线算法)
How far away ? Time Limi ...
- HDU 1512 Monkey King(左偏树+并查集)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1512 [题目大意] 现在有 一群互不认识的猴子,每个猴子有一个能力值,每次选择两个猴子,挑出他们所 ...
随机推荐
- 003.android资源文件剖析(Resources)
android的资源文件使用的重要性,不言而喻.让我们从潜到深逐渐来了解吧. 一:android的基本资源: 1.字符串资源 android的资源文件保存在:res\values\ 2.布局资源 an ...
- ExtJs4 笔记(1) ExtJs大比拼JQuery:Dom文档操作
现在主流的JS框架要数ExtJs和JQuery应用的比较广泛.JQuery属于轻量级的,一般做网站应用比较常见,可见块头小的优势.ExtJs比较庞大,它除了对基本的JS语法和HTML DOM操作方式的 ...
- 模拟new实例化对象。
使用new和字面量的的方法是两种主流创建对象的方法,两种最终都能达到同样的实例化的对象,本章主要围绕new关键字来实例化一个对象并且讲一个不使用new但是完全与new实例化对象相同的例子. 在使用ne ...
- kiss框架学习
#parse("$!jc.skinpath/exam/cart.ascx") var CategoryId = "$!this.loadCategory_combo(). ...
- Java的一些基础小知识之JVM与GC (转)
一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太阳微 ...
- hibernate学习(一)
一.准备工作:导入jar包 1.hibernate的jar包 位置: hibernate-release-5.0.2.Final\hibernate-release-5.0.2.Final\lib\r ...
- zoj 3870
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5518 题意:n个数,从中选出两个数,问这两个数的异或值大于两个数较大 ...
- Selenium来抓取动态加载的页面
一般的爬虫都是直接使用http协议,下载指定url的html内容,并对内容进行分析和抽取.在我写的爬虫框架webmagic里也使用了HttpClient来完成这样的任务. 但是有些页面是通过js以及a ...
- UVa 474 - Heads / Tails Probability
题目:计算1/(2^n)的值的前4为有效数字以及位数. 分析:数论,大整数.直接用数组模拟就可以. 说明:打表计算.查询输出. #include <iostream> #include & ...
- 【POJ 1741】Tree
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11570 Accepted: 3626 Description ...