HDU - 2586 How far away ?(离线Tarjan算法)
1、给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离。
2、这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了。
这里的计算方法是,记下根结点到任意一点的距离dis[],这样ans = dis[u] + dis[v] - 2 * dis[lca(u, v)]
3、
/* 离线算法,LCATarjan 复杂度O(n+Q); */ #include<iostream> #include<stdio.h> #include<string.h> using namespace std;const int MAXN=40005; const int MAXQ=205;//查询数的最大值int dis[MAXN];//到根节点的距离//并查集部分 int F[MAXN];//需要初始化为-1 int find(int x){if(F[x]==-1)return x;return F[x]=find(F[x]); } void bing(int u,int v){int t1=find(u);int t2=find(v);if(t1!=t2)F[t1]=t2; } //*********************** bool vis[MAXN];//访问标记 int ancestor[MAXN];//祖先 struct Edge{int to,next;int d; }edge[MAXN*2]; int head[MAXN],tot; void addedge(int u,int v,int d){edge[tot].to=v;edge[tot].d=d;edge[tot].next=head[u];head[u]=tot++; }struct Query{int q,next;int index;//查询编号 }query[MAXQ*2]; int answer[MAXQ];//存储最后的查询结果,下标0 Q-1 int h[MAXN];//注意此处为MAXN... int tt;void add_query(int u,int v,int index){query[tt].q=v;query[tt].next=h[u];query[tt].index=index;h[u]=tt++;query[tt].q=u;query[tt].next=h[v];query[tt].index=index;h[v]=tt++; }void init(){tot=0;memset(head,-1,sizeof(head));tt=0;memset(h,-1,sizeof(h));memset(vis,false,sizeof(vis));memset(F,-1,sizeof(F));memset(ancestor,0,sizeof(ancestor)); } void LCA(int u){ancestor[u]=u;vis[u]=true;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(vis[v])continue;dis[v]=dis[u]+edge[i].d;LCA(v);bing(u,v);ancestor[find(u)]=u;}for(int i=h[u];i!=-1;i=query[i].next){int v=query[i].q;if(vis[v]){answer[query[i].index]=ancestor[find(v)];}} }int main(){int T;int n,m;int i;int u,v,d;scanf("%d",&T);while(T--){init();scanf("%d%d",&n,&m);for(i=0;i<n-1;++i){scanf("%d%d%d",&u,&v,&d);addedge(u,v,d);addedge(v,u,d);}for(i=0;i<m;++i){scanf("%d%d",&u,&v);add_query(u,v,i);}dis[1]=0;LCA(1);for(i=0;i<m;++i){printf("%d\n",dis[query[i*2].q]+dis[query[i*2+1].q]-2*dis[answer[i]]);}}return 0; }
View Code
转载于:https://www.cnblogs.com/bofengyu/p/4963515.html
HDU - 2586 How far away ?(离线Tarjan算法)相关推荐
- POJ 1330 LCA最近公共祖先 离线tarjan算法
题意要求一棵树上,两个点的最近公共祖先 即LCA 现学了一下LCA-Tarjan算法,还挺好理解的,这是个离线的算法,先把询问存贮起来,在一遍dfs过程中,找到了对应的询问点,即可输出 原理用了并查集 ...
- 【HDU - 1269】迷宫城堡 (tarjan算法模板)
题干: 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只 ...
- 【HDU 1269】迷宫城堡 (Tarjan算法)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 有向图强连通分量tarjan算法
转自:http://www.byvoid.com/blog/scc-tarjan/ http://blog.csdn.net/geniusluzh/article/details/6601514 在有 ...
- 【转】BYV--有向图强连通分量的Tarjan算法
转自beyond the void 的博客: https://www.byvoid.com/zhs/blog/scc-tarjan 注:红色为标注部分 [有向图强连通分量] 在有向图G中,如果两个顶点 ...
- byvoid 神牛的tarjan算法讲解!
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通 (strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图 .非强连通图有向图 ...
- 有向图强连通分量的Tarjan算法——转自BYVoid
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- [转载] 有向图强连通分量的Tarjan算法 ——byvoid
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大 ...
最新文章
- python装饰器+迭代器+生成器
- 人工智能进军餐饮:AI调酒,越喝越有
- 小程序中Cannot read property ‘setData‘ of undefined问题的解决
- linux 后台任务 运行 关闭 查看
- 【Azure Services Platform Step by Step-第5篇】.NET Services 概述
- 消息推送服务器令牌,小程序-消息推送配置Token令牌错误校验失败如何解决
- Perl语言入门-第四章-子程序-习题
- HBase优化案例分析:Facebook Messages系统问题与解决方案
- Quartus17下载程序进FPGA
- ASP.NET 2.0 Web Part编程之定制Web Part
- 【L298N 驱动电机的线路连接图】
- Opencv实现身份证OCR识别
- C++正则表达式(regex_match、regex_search与regex_replace)
- 【实战】Spring+Spring MVC+Mybatis实战项目之云笔记项目
- Redis实现分布式锁(setnx、getset、incr)以及如何处理超时情况(一)
- 卢卡斯定理及python实现
- 盛世昊通董车长APP新功能上线,看视频获收益
- Linux LVM 总结
- 近日我方收到大量用户QQ发送涉黄图低俗等文字,腾讯QQ回应疑似被盗号!
- 关于人工智能,你知道怎么学吗
热门文章
- python __repr__
- Scala Case
- opencv SIFT角检测
- 微型计算机天逸510s光驱,主机届的小钢炮,性能最强NAS——天逸510S Mini
- 对象存储 OSS > 产品简介 > 什么是对象存储OSS
- 滴普科技,全场景数据智能服务商
- Docker禁令生效,开始限制所有被美国列入实体清单的公司和个人使用Docker
- Spring学习总结(27)——Spring常用注解再总结
- harbor 多端口_总结—Harbor仓库部署和使用问题集锦
- linux文件系统管理实践题目,Linux软件管理、文件系统管理实践