hdu 2586 How far away ?(离线tarjan求LCA)
2015-08-26 18:33
489 查看
n座房子由n-1条道路连接,形成一棵树。给出道路长度,进行m个询问:两个房子间路径长度)
树中不存在父子关系,因此建立无向边。选择任意一个结点(房子)作为根节点进行DFS,传入一个参数w表示该结点距离根节点的距离。同时开设一个数组d,用来记录各个结点到根节点的距离。那么对于查询的两个点u,v,其路径长度就等于d[u]+d[v]-d[LCA(u,v)]*2
树中不存在父子关系,因此建立无向边。选择任意一个结点(房子)作为根节点进行DFS,传入一个参数w表示该结点距离根节点的距离。同时开设一个数组d,用来记录各个结点到根节点的距离。那么对于查询的两个点u,v,其路径长度就等于d[u]+d[v]-d[LCA(u,v)]*2
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<stack> #include<cmath> #include<queue> #include<vector> using namespace std; #define maxn 40005 #define maxm 1000005 vector<int> G[maxn],Q[maxn],id[maxn],W[maxn]; bool vis[maxn]; int fa[maxn],ans[205],d[maxn]; int Find(int x) { if(fa[x]==x) return x; return fa[x]=Find(fa[x]); } void Union(int x,int y) { x=Find(x); y=Find(y); if(x==y) return; fa[y]=x; } void dfs(int u,int w) { vis[u]=1,d[u]=w; for(int i=0;i<(int)G[u].size();++i) { int v=G[u][i]; if(vis[v]) continue; dfs(v,w+W[u][i]); Union(u,v); } for(int i=0;i<(int)Q[u].size();++i) { int v=Q[u][i]; if(!vis[v]) continue; ans[id[u][i]]=d[u]+d[v]-(d[Find(v)]<<1); } } int main() { int n,i,T,u,v,w,q; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&q); for(i=0;i<=n;++i){ G[i].clear(); Q[i].clear(); W[i].clear(); d[i]=0; id[i].clear(); fa[i]=i; vis[i]=0; } for(i=0;i<n-1;++i) { scanf("%d%d%d",&u,&v,&w); G[u].push_back(v); G[v].push_back(u); W[u].push_back(w); W[v].push_back(w); } for(i=0;i<q;++i) { scanf("%d%d",&u,&v); Q[u].push_back(v); Q[v].push_back(u); id[u].push_back(i); id[v].push_back(i); } dfs(1,0); for(i=0;i<q;++i) printf("%d\n",ans[i]); } return 0; }
相关文章推荐
- 树莓派变成了只读文件系统
- Jenkins Maven Ant Hudson几个工具的比较
- python列表元素去重
- Struts2初次框架配置
- Struts2笔记——初次框架配置
- vmware workstation 10 虚拟机可以ping通主机,但主机ping不通虚拟机
- C预言之头文件路径选择
- 3D打印切片软件CuraEngine介绍 windows版本
- 朴素贝叶斯–分类器
- android面试题总结加强再加强版(四)
- Kali Linux中前十名的Wifi攻击工具
- SA 的参数
- Cocos2dx - 创建半透明层并屏蔽向下触摸
- CityEngine中的comp(f)
- android面试题总结加强再加强版(三)
- 九度OJ 题目1138:进制转换
- 【Ubuntu】ubuntu物理机安装方法:U盘安装
- android面试题总结加强再加强版(二)
- poj 2002 Squares (hash 拉链 点集)
- mysql视图介绍