poj-1986 Distance Queries(lca+ST+dfs)
题目链接:
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 11531 | Accepted: 4068 | |
Case Time Limit: 1000MS |
Description
Input
* Line 2+M: A single integer, K. 1 <= K <= 10,000
* Lines 3+M..2+M+K: Each line corresponds to a distance query and contains the indices of two farms.
Output
Sample Input
- 7 6
- 1 6 13 E
- 6 3 9 E
- 3 5 7 S
- 4 1 3 N
- 2 4 20 W
- 4 7 2 S
- 3
- 1 6
- 1 4
- 2 6
Sample Output
- 13
- 3
- 36
- 题意:
- 给一棵树;问两点之间的距离;
- 思路:
- lca的模板题,一开始莫名其妙的wa了,看了好久才发现是一个地方写反了;后来又tle,把cin改成scanf就好了;看来还是不能用cin;
- AC代码:
- /*2014300227 1986 Accepted 13984K 485MS G++ 2077B*/
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- const int N=4e4+;
- typedef long long ll;
- const double PI=acos(-1.0);
- int n,m,cnt,head[N],vis[N],a[*N],dep[N],first[N],dis[N],num,dp[*N][],p[N];
- struct Edge
- {
- int to,next,val;
- };
- Edge edge[*N];
- void add_edge(int s,int e,int va)
- {
- edge[cnt].to=e;
- edge[cnt].next=head[s];
- edge[cnt].val=va;
- head[s]=cnt++;
- }
- int dfs(int x,int deep)
- {
- vis[x]=;
- first[x]=num;
- a[num++]=x;
- dep[x]=deep;
- for(int i=head[x];i!=-;i=edge[i].next)
- {
- int y=edge[i].to;
- if(!vis[y])
- {
- dis[y]=dis[x]+edge[i].val;
- dfs(y,deep+);
- a[num++]=x;
- }
- }
- }
- int RMQ()
- {
- for(int i=;i<num;i++)
- {
- dp[i][]=a[i];
- }
- for(int j=;(<<j)<=num;j++)
- {
- for(int i=;i+(<<j)-<num;i++)
- {
- if(dep[dp[i][j-]]<dep[dp[i+(<<(j-))][j-]])dp[i][j]=dp[i][j-];
- else dp[i][j]=dp[i+(<<(j-))][j-];
- }
- }
- }
- int query(int l,int r)
- {
- int temp=(int)(log((r-l+)*1.0)/log(2.0));
- if(dep[dp[l][temp]]<dep[dp[r-(<<temp)+][temp]])return dp[l][temp];
- else return dp[r-(<<temp)+][temp];
- }
- int main()
- {
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- cnt=;
- num=;
- for(int i=;i<=n;i++)
- {
- vis[i]=;
- head[i]=-;
- }
- int u,v,w;
- char s[];
- for(int i=;i<m;i++)
- {
- scanf("%d%d%d%s",&u,&v,&w,s);
- //cin>>u>>v>>w>>s;
- add_edge(u,v,w);
- add_edge(v,u,w);
- }
- dis[]=;
- dfs(,);
- RMQ();
- int q,fx,fy;
- scanf("%d",&q);
- while(q--)
- {
- scanf("%d%d",&fx,&fy);
- int lca;
- if(first[fx]<first[fy])
- {
- lca=query(first[fx],first[fy]);
- }
- else lca=query(first[fy],first[fx]);
- printf("%d\n",dis[fx]+dis[fy]-*dis[lca]);
- }
- }
- return ;
- }
poj-1986 Distance Queries(lca+ST+dfs)的更多相关文章
- 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 LCA
题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...
- 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(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 【输入YY && LCA(Tarjan离线)】
任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total ...
- POJ 1986 Distance Queries(Tarjan离线法求LCA)
Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12846 Accepted: 4552 ...
- poj 1986 Distance Queries 带权lca 模版题
Distance Queries Description Farmer John's cows refused to run in his marathon since he chose a pa ...
随机推荐
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- 转:DDR中端接技术基本概念
DDR中端接技术基本概念 版权声明:转载请注明出处:http://blog.csdn.net/lg2lh https://blog.csdn.net/lg2lh/article/details/90 ...
- Linux XMind
XMind这个软件好像不错的样子,至少在Windows/Linux/Mac下都可以工作,作为FreeMind的替代品应该是没什么问题(还有一个vym貌似也可以,可能没有XMind好,毕竟XMind有公 ...
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<vector> ...
- python os模块 常用函数
os.getcwd() 获取当前工作目录 os.listdir() 返回指定目录下的所有文件和目录 os.remove() 删除单个文件 os.path.split() 以元祖形式返回一个路径的目录和 ...
- asp.net 后台多线程异步处理时的 进度条实现一(Ajax+Ashx实现以及封装成控件的实现)
(更新:有的同学说源代码不想看,说明也不想看,只想要一个demo,这边提供一下:http://url.cn/LPT50k (密码:TPHU)) 工作好长时间了,这期间许多功能也写成了不少的控件来使用, ...
- android 导入项目 项目中文字乱码问题
乱码问题出现了几次,一直没有在意,今天又出现了,现总结如下: eclipse之所以会出现乱码问题是因为eclipse编辑器选择的编码规则是可变的.一般默认都是UTF-8或者GBK,当从外部导入的一个工 ...
- python scrapy爬虫框架
http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html scrapy 提取html的标签内容 from scrapy.selec ...
- 【峰回路转】Excel技巧百例 08.计算两个日期的差值
在Excel中假设高速计算两个日期之间的差? 比如A日期为:2012/3/12 B日期为:2015/7/29 那么这两个日期之间差几年,差几个月.差多少天? 我们使用DateDif 函数来处理. ...
- EntityFramework走马观花之CRUD(下)
我在Entity Framework系列文章的CRUD上篇中介绍了EF的数据查询,中篇谈到了EF的数据更新,下篇则聊聊EF实现CRUD的内部原理. 跟踪实体对象状态 在CRUD上篇和中篇谈到,为了实现 ...