hdu-2586 How far away ?(lca+bfs+dfs+线段树)
题目链接:
How far away ?
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
- #include <bits/stdc++.h>
- using namespace std;
- const int N=4e4+;
- typedef long long ll;
- const double PI=acos(-1.0);
- int n,m,t,dis[N],dep[N],vis[N],w[N];
- vector<int>ve[N];
- queue<int>qu;
- int u[N],v[N],d[N],fa[N],a[*N],tot,first[N];
- struct Tree
- {
- int l,r,ans;
- };
- Tree tree[*N];
- void bfs()//bfs把图转化成树;
- {
- qu.push();
- vis[]=;
- dep[]=;
- while(!qu.empty())
- {
- int top=qu.front();
- qu.pop();
- int len=ve[top].size();
- for(int i=;i<len;i++)
- {
- int x=ve[top][i];
- if(!vis[x])
- {
- vis[x]=;
- qu.push(x);
- dep[x]=dep[top]+;
- fa[x]=top;
- }
- }
- }
- }
- int dfs(int num)//dfs找到lca的数组,并计算i到1的dis
- {
- vis[num]=;
- first[num]=tot;
- a[tot++]=num;
- int len=ve[num].size();
- for(int i=;i<len;i++)
- {
- int x=ve[num][i];
- if(vis[x])
- {
- dis[x]=dis[num]+d[x];
- dfs(x);
- a[tot++]=num;
- }
- }
- }
- void Pushup(int node)
- {
- if(dep[a[tree[*node].ans]]>=dep[a[tree[*node+].ans]])tree[node].ans=tree[*node+].ans;
- else tree[node].ans=tree[*node].ans;
- }//tree[node].ans为数组里的lca的位置;
- void build(int node,int L,int R)
- {
- tree[node].l=L;
- tree[node].r=R;
- if(L>=R)
- {
- tree[node].ans=L;
- return ;
- }
- int mid=(L+R)>>;
- build(*node,L,mid);
- build(*node+,mid+,R);
- Pushup(node);
- }
- int query(int node,int L,int R)
- {
- if(L<=tree[node].l&&R>=tree[node].r)return tree[node].ans;
- int mid=(tree[node].l+tree[node].r)>>;
- if(R<=mid)return query(*node,L,R);
- else if(L>mid)return query(*node+,L,R);
- else
- {
- int pos1=query(*node,L,mid),pos2=query(*node+,mid+,R);
- if(dep[a[pos1]]>=dep[a[pos2]])return pos2;
- else return pos1;
- }
- }
- int main()
- {
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)
- {
- ve[i].clear();
- }
- for(int i=;i<n;i++)
- {
- scanf("%d%d%d",&u[i],&v[i],&w[i]);
- ve[u[i]].push_back(v[i]);
- ve[v[i]].push_back(u[i]);
- }
- memset(vis,,sizeof(vis));
- bfs();
- for(int i=;i<n;i++)
- {
- if(fa[u[i]]==v[i])
- {
- d[u[i]]=w[i];
- }
- else
- {
- d[v[i]]=w[i];
- }
- }
- tot=;
- dfs();
- build(,,tot-);
- int ql,qr;
- for(int i=;i<m;i++)
- {
- scanf("%d%d",&ql,&qr);
- int pos;
- if(first[ql]<=first[qr])
- pos=query(,first[ql],first[qr]);
- else pos=query(,first[qr],first[ql]);
- printf("%d\n",dis[ql]-dis[a[pos]]-dis[a[pos]]+dis[qr]);
- }
- }
- return ;
- }
hdu-2586 How far away ?(lca+bfs+dfs+线段树)的更多相关文章
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径
51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...
- Codeforces1110F Nearest Leaf dfs + 线段树 + 询问离线
Codeforces1110F dfs + 线段树 + 询问离线 F. Nearest Leaf Description: Let's define the Eulerian traversal of ...
- HDU 2795 Billboard(宣传栏贴公告,线段树应用)
HDU 2795 Billboard(宣传栏贴公告,线段树应用) ACM 题目地址:HDU 2795 Billboard 题意: 要在h*w宣传栏上贴公告,每条公告的高度都是为1的,并且每条公告都要 ...
- dfs+线段树 zhrt的数据结构课
zhrt的数据结构课 这个题目我觉得是一个有一点点思维的dfs+线段树 虽然说看起来可以用树链剖分写,但是这个题目时间卡了树剖 因为之前用树剖一直在写这个,所以一直想的是区间更新,想dfs+线段树,有 ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- hdu 5692(dfs+线段树) Snacks
题目http://acm.hdu.edu.cn/showproblem.php?pid=5692 题目说每个点至多经过一次,那么就是只能一条路线走到底的意思,看到这题的格式, 多个询问多个更新, 自然 ...
- HDU 3974 Assign the task (DFS+线段树)
题意:给定一棵树的公司职员管理图,有两种操作, 第一种是 T x y,把 x 及员工都变成 y, 第二种是 C x 询问 x 当前的数. 析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护 ...
随机推荐
- 世纪怎么换算成具体的年份?eg:19世纪60年代=19??年?
http://zhidao.baidu.com/question/339742625.html&__bd_tkn__=6ab5183c226b84031b08b849ecac35b396039 ...
- VueJS自定义全局和局部指令
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令. 使用directive自定义全局指令 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面 ...
- eclipse.ini配置文件
Eclipse安装Maven插件后,Eclipse启动问题:Maven Integration for Eclipse JDK Warning. 解决方法: 1. 设置Eclipse使用的JRE为本 ...
- git系列1
git clone支持多种协议,除了HTTP(s)以外,还支持SSH.Git.本地文件协议等,下面是一些例子. $ git clone http[s]://example.com/path/to/re ...
- gdb ../sysdeps/i386/elf/start.S: No such file or directory
使用 gdb 调试的时候 输入 l 之后出现下列信息 (gdb) l 1 ../sysdeps/i386/elf/start.S: No such file or directory. in ../s ...
- MySQL 5.7 等高版本关于JDBC驱动的几个问题
https://blog.csdn.net/dj673344908/article/details/85223313 mysql 5.7 用8.0版本的驱动可以,5.1版本也可以,5.5.5.6.5. ...
- EasyPlayer RTSP Windows播放器D3D,GDI的几种渲染方式的选择区别
EasyPlayer-RTSP windows播放器支持D3D和GDI两种渲染方式,其中D3D支持格式如下: DISPLAY_FORMAT_YV12 DISPLAY_FORMAT_YUY2 DISPL ...
- EasyDSS RTMP流媒体解决方案之Windows服务安装方案
Windows服务安装 EasyDSS_Solution流媒体解决方案,可以通过start一键启动.在实际应用中,我们希望可以设置成系统服务,那么下面我将会介绍,如何在windows中将流媒体解决方案 ...
- Elipse clean后无法编译出class文件
通常之前一直运行正常的项目,在某次修改或重新启动时总是报 ClassNotFoundException,而事实是这个类确实存在,出现这种原因最好看看 build文件下的classes是否为空 或 编译 ...
- sql查询的日期判断问题
在SQLSERVE中,如果某个数据表的类型被定义成datetime类型,那么数据是包含秒的.这时候如何查询某天的数据呢?新手们可能想:最直接的做法是把时间部分去掉,只取日期部分.于是日期的函数就用上了 ...