lca最短公共祖先模板(hdu2586)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<queue>
- #include<vector>
- #include<string.h>
- #include<cstring>
- #include<algorithm>
- #include<set>
- #include<map>
- #include<fstream>
- #include<cstdlib>
- #include<ctime>
- #include<list>
- #include<climits>
- #include<bitset>
- using namespace std;
- #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
- #define fopen freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
- #define scd(a) scanf("%d",&a)
- #define scf(a) scanf("%lf",&a)
- #define scl(a) scanf("%lld",&a)
- #define sci(a) scanf("%I64d",&a)
- #define scs(a) scanf("%s",a)
- #define left asfdasdasdfasdfsdfasfsdfasfdas1
- #define tan asfdasdasdfasdfasfdfasfsdfasfdas
- typedef long long ll;
- typedef unsigned int un;
- const int desll[][]={{,},{,-},{,},{-,}};
- const ll mod=1e9+;
- const int maxn=4e4+;
- const int maxm=3e8+;
- const double eps=1e-;
- int m,n;
- struct node
- {
- int b,nex,c;
- }no[maxn*];
- int head[maxn],sz=;
- int add(int a,int b,int c){
- no[sz].b=b;
- no[sz].c=c;
- no[sz].nex=head[a];
- head[a]=sz++;
- }
- int father[maxn],tan[maxn*][],dep[maxn];
- int ar[maxn*],le,in[maxn];
- ll dis[maxn];
- void dfs1(int u,int pre){
- for(int i=head[u];i!=-;i=no[i].nex){
- int v=no[i].b;
- if(v==pre)continue;
- dis[v]=dis[u]+no[i].c;
- father[v]=u;
- dep[v]=dep[u]+;
- ar[le++]=u;
- dfs1(v,u);
- }
- in[u]=le;
- ar[le++]=u;
- }
- void init()
- {
- memset(tan,,sizeof(tan));
- for(int i=;i<le;i++){
- tan[i][]=ar[i];
- }
- for(int j=;j<;j++){
- for(int i=le-;i>=;i--){
- if(i+(<<j)->=le)continue;
- int x=tan[i][j-],y=tan[i+(<<(j-))][j-];
- if(dep[x]<dep[y])tan[i][j]=x;
- else tan[i][j]=y;
- //cout<<i<<" "<<j<<" "<<tan[i][j]<<endl;
- }
- }
- }
- int sameFather(int a,int b)
- {
- a=in[a];
- b=in[b];
- if(a>b)swap(a,b);
- int res=floor(log(b-a+)/log());
- int x=tan[a][res],y=tan[b-(<<res)+][res];
- if(dep[x]<dep[y])return x;
- else return y;
- }
- int main()
- {
- int t;scd(t);
- while(t--){
- scd(n);scd(m);
- memset(head,-,sizeof(head));sz=;
- for(int i=;i<n;i++){
- int a,b,c;
- scd(a);scd(b);scd(c);
- add(a,b,c);
- add(b,a,c);
- }
- memset(dis,,sizeof(dis));
- memset(dep,,sizeof(dep));
- dep[]=;
- dfs1(,);
- father[]=;
- init();
- for(int i=;i<m;i++){
- int a,b;
- scd(a);scd(b);
- int x=sameFather(a,b);
- printf("%d\n",dis[a]+dis[b]-*dis[x]);
- }
- }
- return ;
- }
lca最短公共祖先模板(hdu2586)的更多相关文章
- LCA(最近公共祖先)模板
Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...
- LCA最近公共祖先模板(求树上任意两个节点的最短距离 || 求两个点的路进(有且只有唯一的一条))
原理可以参考大神 LCA_Tarjan (离线) TarjanTarjan 算法求 LCA 的时间复杂度为 O(n+q) ,是一种离线算法,要用到并查集.(注:这里的复杂度其实应该不是 O(n+q) ...
- LCA最近公共祖先模板代码
vector模拟邻接表: #include<iostream> #include<cstdio> #include<cstring> #include<cma ...
- LCA(最近公共祖先)之倍增算法
概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...
- lca 最近公共祖先
http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm& ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...
- LCA近期公共祖先
LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...
- LCA 近期公共祖先 小结
LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...
随机推荐
- codeforces 1060 A
https://codeforces.com/contest/1060/problem/A 题意:电话号码是以8开头的11位数,给你n 个数问最多可以有多少个电话号码 题解:min(8的个数,n/11 ...
- Ubuntu 编译Webkit --gtk
转载自:http://www.linuxidc.com/Linux/2011-10/44809.htm webkit是一个浏览器内核,google的chrome就是基于它的,下面介绍一下如何在Ubun ...
- 前端跨域之jsonp跨域
jsonp跨域原理 原理:因为通过script标签引入的js是不受同源策略的限制的(比如baidu.com的页面加载了google.com的js).所以我们可以通过script标签引入一个js或者一个 ...
- Lucene4.6查询时完全跳过打分,提高查询效率的实现方式
由于索引的文件量比较大,而且应用中不需要对文档进行打分,只需要查询出所有满足条件的文档.所以需要跳过打分来提高查询效率.一开始想用ConstantScoreQuery,但是测试发现这个类虽然让所有返回 ...
- 【hdu3080】01背包(容量10^7)
[题意]n个物品,有wi和vi,组成若干个联通块,只能选取一个联通块,问得到m的价值时最小要多少空间(v).n<=50,v<=10^7 [题解] 先用并查集找出各个联通块. 这题主要就是v ...
- NOIP2005过河(青蛙过河)
题目传送门 这道题主要是因为L长度最大可以为1e9 而石子却最多只有100个 这样就浪费了很多时间空间 所以我们压缩一波路径就可以了 剩余的就是枚举每个点以及i-y到i-x的dp了 这里要说一句为什么 ...
- 【HDU】6146 Pokémon GO
[题意]一个2*n的网格,再保证步数最少的情况下,求从任意格出发遍历完所有格的方案数,格子八连通.n<=10000,T<=100. [算法]递推,DP [题解]原题链接:蓝桥杯 格子刷油漆 ...
- #error#错误原因:Cannot find executable for CFBundle 0x8ad60b0 (not loaded)
#error#错误原因:Cannot find executable for CFBundle 0x8ad60b0 </Applications/Xcode.app/Contents/Devel ...
- 小白科普之JavaScript的DOM模型
微信公众号“前端大全”推送了一篇名为“通俗易懂的来讲讲DOM”的文章,把javascript原生DOM相关内容讲解的很详细.仔细读了一遍,觉得整理总结的不错,对自己也很使用,所以把内容整理过来,并根据 ...
- linux下su和su - 的区别
linux使用中常会使用su来切换用户 使用su切换为tom用户 [root@bogon ~]# su tom[tom@bogon root]$ [tom@bogon root]$ pwd/root ...