POJ - 1986 Distance Queries(离线Tarjan算法)
1、一颗树中,给出a,b,求最近的距离。(我没考虑不联通的情况,即不是一颗树的情况)
2、用最近公共祖先来求,
记下根结点到任意一点的距离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=;
- const int MAXQ=;//查询数的最大值
- int dis[MAXN];//到根节点的距离
- //并查集部分
- int F[MAXN];//需要初始化为-1
- int find(int x){
- if(F[x]==-)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*];
- 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*];
- 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=;
- memset(head,-,sizeof(head));
- tt=;
- memset(h,-,sizeof(h));
- memset(vis,false,sizeof(vis));
- memset(F,-,sizeof(F));
- memset(ancestor,,sizeof(ancestor));
- }
- void LCA(int u){
- ancestor[u]=u;
- vis[u]=true;
- for(int i=head[u];i!=-;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!=-;i=query[i].next){
- int v=query[i].q;
- if(vis[v]){
- answer[query[i].index]=ancestor[find(v)];
- }
- }
- }
- int main(){
- int n,m;
- int i;
- int u,v,d;
- char str[];
- init();
- scanf("%d%d",&n,&n);
- for(i=;i<n;++i){
- scanf("%d%d%d%1s",&u,&v,&d,str);
- addedge(u,v,d);
- addedge(v,u,d);
- }
- scanf("%d",&m);
- for(i=;i<m;++i){
- scanf("%d%d",&u,&v);
- add_query(u,v,i);
- }
- dis[]=;
- LCA();
- for(i=;i<m;++i){
- printf("%d\n",dis[query[i*].q]+dis[query[i*+].q]-*dis[answer[i]]);
- }
- return ;
- }
POJ - 1986 Distance Queries(离线Tarjan算法)的更多相关文章
- POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)
题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...
- POJ 1986 Distance Queries(Tarjan离线法求LCA)
Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12846 Accepted: 4552 ...
- POJ 1986 Distance Queries(LCA Tarjan法)
Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- POJ.1986 Distance Queries ( LCA 倍增 )
POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...
- POJ 1986 Distance Queries LCA两点距离树
标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...
- POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】
任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total ...
- POJ 1986 - Distance Queries - [LCA模板题][Tarjan-LCA算法]
题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...
- POJ 1986 Distance Queries (最近公共祖先,tarjan)
本题目输入格式同1984,这里的数据范围坑死我了!!!1984上的题目说边数m的范围40000,因为双向边,我开了80000+的大小,却RE.后来果断尝试下开了400000的大小,AC.题意:给出n个 ...
- poj 1986 Distance Queries LCA
题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...
随机推荐
- bootspring网站项目,Date类型插入数据库始终比正确时间早一天问题的解决
bug描述 昨天的Date插入不进去问题解决后,一直没发现其实插入的时间一直比正确的时间早一天 输出sql语句,发现insert语句还是对的,不知道为什么插入数据库之后结果就早了一天 https:// ...
- unittest多线程生成报告(BeautifulReport)
前言 selenium多线程跑用例,这个前面一篇已经解决了,如何生成一个测试报告这个是难点,刚好在github上有个大神分享了BeautifulReport,完美的结合起来,就能生成报告了. 环境必备 ...
- BeautifulSoup实例
Beautiful Soup 4.4.0 中文文档:http://beautifulsoup.readthedocs.io/zh_CN/latest/ #coding:utf-8from bs4 im ...
- 聊聊flink的log.file配置
本文主要研究一下flink的log.file配置 log4j.properties flink-release-1.6.2/flink-dist/src/main/flink-bin/conf/log ...
- @Temporal()注解的使用
数据库的字段类型有date.time.datetime而Temporal注解的作用就是帮Java的Date类型进行格式化,一共有三种注解值: 第一种:@Temporal(TemporalType.DA ...
- Hotel(poj 3667)
题意:询问区间最长连续空串 /* 用线段树维护区间最长连续左空串和右空串 */ #include<cstdio> #include<iostream> #define N 50 ...
- [转]android 如何获取第三方app的sha1值
对于android 应用的sha1值和md5值的获取,如果是我们自己的应用,不论是获取测试的和正式的都是比较方便的.但是如何去获取别人开发的app的sha1和md5呢,并且我们只有apk有没有相关的文 ...
- [APIO2012] 派遣 dispatching
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4580 Solved: 2348 Description 在一个忍者的帮派里,一些忍者们被选中派遣给 ...
- React Native资料汇总
React Native 官方文档中文版翻译 http://wiki.jikexueyuan.com/project/react-native/homepage.html REACT NATIVE开发 ...
- codevs——3064 求和
3064 求和 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 青铜 Bronze 题解 查看运行结果 题目描述 Description 输入一个数x(x <= ...