【Lca 离线Tarjan算法】hdu 2586 How far away ?
来源:互联网 发布:河南省863软件孵化器 编辑:程序博客网 时间:2024/06/05 16:43
LCA 离线Tarjan算法
题意: 对于一个图,n(<=40000)个点,给出n-1条边(u,v,w,), m(<=200)个询问给出两点,问其最短距离。
离线算法(必然先存所有询问);
dfs:
1. 遍历到当前点,创造一个当前点的集合
2. 对于遍历完的子树,将其根节点的集合加入其父节点所在的集合。
3. 对于询问的两点,遍历到一点,如果另一点已经被遍历,那么另一点已经加入集合的最高那一点即为最近公共祖先。
4. 因为另一点可能在此点的子树上,所以询问的答案应该在遍历完其子树后执行。
注意: 问题的记录最好用前向星写吧。
#include<bits/stdc++.h>using namespace std;typedef long long LL;//#pragma comment(linker, "/STACK:102400000,102400000")const double PI = acos(-1.0);const double eps = 1e-6;const int INF=0x3f3f3f3f;const LL mod = 1e9+7;const int N = 100000+10;const int M = 2500000;struct Node{ int from; int to; int val; int next;};int dir[N],fa[N],vis[N];vector<Node> ma[N]; //vector 记录图Node query[N*2];int head[N];int ans[N];void addquery(int u,int v,int &top){ query[++top].from = u; query[top].to = v; query[top].next = head[u]; head[u] = top; query[++top].from = v; query[top].to = u; query[top].next = head[v]; head[v] = top;}int Find(int n){ if(fa[n] != n){ fa[n] = Find(fa[n]); } return fa[n];}void dfs(int n,int dist) //dfs处理需要数组{ fa[n] = n; vis[n]=true; dir[n]=dist; for(int i = 0; i < ma[n].size(); i++){ Node temp = ma[n][i]; if(!vis[temp.to]){ dfs(temp.to,dist+temp.val); fa[temp.to] = n; } } for(int i = head[n]; i != -1; i=query[i].next){ int v = query[i].to; if(vis[v]){ int pa = Find(v); //query[i].val = dir[n]+dir[v]-2*dir[pa]; ans[(i-1)/2] = dir[n]+dir[v]-2*dir[pa]; } }}int main(){ int T; scanf("%d",&T); while(T--){ memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); int n,m; scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++){ ma[i].clear(); } for(int i = 1; i < n; i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); Node temp; temp.to = v; temp.val = w; ma[u].push_back(temp); temp.to = u; temp.val = w; ma[v].push_back(temp); } int top = 0; for(int i = 0; i < m; i++){ int u,v; scanf("%d%d",&u,&v); addquery(u,v,top); } dfs(1,0); for(int i = 0; i < m; i++){ printf("%d\n",ans[i]); } } return 0;}
阅读全文
0 0
- HDU 2586 How far away ? (离线LCA Tarjan算法模板)
- hdu 2586 How far away?(LCA离线Tarjan算法)
- 【Lca 离线Tarjan算法】hdu 2586 How far away ?
- HDU 2586 How far away? LCA 离线tarjan
- hdu 2586 How far away ?(离线tarjan求LCA)
- HDU 2586 How far away ? LCA离线tarjan思想
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ? (LCA 离线tarjan)
- HDU OJ 2586 How far away ?【LCA的Tarjan离线算法】
- HDU 2586 How far away ? LCA的Tarjan离线算法
- HDU ACM 2586 How far away ?LCA->并查集+Tarjan(离线)算法
- HDU 2586 How Far Away?(Tarjan离线算法求lca)
- HDU 2586How far away ? tarjan算法求LCA
- HDU 2586 How far away ?LCA Tarjan
- HDU 2586 How far away ?(Tarjan离线算法)
- hdu 2586 How far away ? LCA离线算法
- hdu 2586 How far away ? lca 在线和离线算法
- HDU 2586 How far away ? 离线LCA
- 2017暑假集训 div1 最短路(2)
- json使用简介
- 【尺取法】小练
- WindowManager添加一个悬浮的Window
- 第一场个人训练赛——D-求绝对值(HDU 2003)
- 【Lca 离线Tarjan算法】hdu 2586 How far away ?
- ArcGIS JS Map添加FeatureLayer
- Oracle中用一个序列给两个表创建主键自增功能的后果
- Maven中工具类工程的搭建
- mysql 从master slave模式升级到group replication模式的方法
- python练习(二)
- idea使用中一些头疼的问题
- 爬取得到数据写入过文件时出现UnicodeEncodeError的错误
- writing BlueC ore Applications User Guide译文