HDU2586 How far away ?(tarjan+并查集离线求lca)
来源:互联网 发布:手机淘宝全球购入口 编辑:程序博客网 时间:2024/05/23 19:19
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2586
这题大概是个模板题,又学了一个新姿势。先dfs一遍,求出每个点到根节点的距离。然后将询问离线,开始求lca,在dfs的时候同时更新并查集,就能求出当前位置下的已访问过的两个点的lca,两个点(a,b)的距离就是d[a]+d[b]-2*d[lca(a,b)];
#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>#include <cctype>#include <string>#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <ctime>using namespace std;typedef long long ll;typedef pair<int,int> pii;#define pb push_back#define mp make_pair#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define calm (l+r)>>1const int INF = 1e9+7;const int maxn=40010;int n,m,Ecnt,Ecnt2,head[maxn],head2[maxn];struct EE{ int to,v,next; EE(){} EE(int t,int v,int n):to(t),v(v),next(n){}}edge[maxn<<1];struct E{ int to,next,lca; E(){} E(int t,int n):to(t),next(n){}}edge2[210];int dis[maxn],pre[maxn];ll ans[maxn];bool vis[maxn];inline void add(int a,int b,int c){ edge[Ecnt]=EE(b,c,head[a]); head[a]=Ecnt++;}inline void add2(int a,int b){ edge2[Ecnt2]=E(b,head2[a]); head2[a]=Ecnt2++;}void dfs(int s=1,int pre=0,int d=0){ dis[s]=d; for(int i=head[s];~i;i=edge[i].next){ int t=edge[i].to; if(t==pre)continue; dfs(t,s,d+edge[i].v); }}int find(int x){ if(pre[x]==x)return x; return pre[x]=find(pre[x]);}void lca(int s=1){ pre[s]=s; vis[s]=true; for(int i=head[s];~i;i=edge[i].next){ int t=edge[i].to; if(!vis[t]){ lca(t); pre[t]=s; } } for(int i=head2[s];~i;i=edge2[i].next){ if(vis[edge2[i].to]){ edge2[i].lca=find(edge2[i].to); ans[i]=dis[s]+dis[edge2[i].to]-2*dis[edge2[i].lca]; } }}int main(){ //freopen("D://input.txt","r",stdin); int T;scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); memset(head,-1,sizeof head); memset(head2,-1,sizeof head2); Ecnt=Ecnt2=0; for(int i=1;i<n;i++){ int a,b,c;scanf("%d%d%d",&a,&b,&c); add(a,b,c);add(b,a,c); } for(int i=0;i<m;i++){ int a,b;scanf("%d%d",&a,&b); add2(a,b); } memset(dis,0,sizeof dis); memset(vis,false,sizeof vis); dfs(); lca(); for(int i=0;i<m;i++){ printf("%I64d\n",ans[i]); } } return 0;}
0 0
- HDU2586 How far away ?(tarjan+并查集离线求lca)
- hdu2586 How far away? Tarjan(离线)算法求最近公共祖先LCA 待补完
- hdu2586 How far away ?--tarjan & LCA
- hdu2586 How far away ? 【图论-Tarjan-Lca】
- Tarjan-LCA HDU2586 How far away ?
- HDU ACM 2586 How far away ?LCA->并查集+Tarjan(离线)算法
- hdu2586-How far away ?(最近公共祖先(LCA),离线Tarjan算法)
- 离线LCA hdu2586 How far away ?
- hdu2586 How far away ? (LCA离线)
- hdu2586-LCA(tarjan法)-How far away ?
- HDU2586 How far away ?(LCA,Tarjan算法)
- HDU2586 How far away ?(LCA离线算法)
- hdu2586 How far away ?&& poj1986 Distance Queries(LCA离线求最短距离)
- hdu2586 how far away?(lca求距离)
- hdu 2586 How far away ?(离线tarjan求LCA)
- hdu2586 How far away ?(LCA->RMQ)
- HDU2586 How far away?(树链剖分求LCA)
- hdu2586 How far away? LCA
- IPhone之判断是否为数字
- 哎呀,被论坛版主踢出来了,只好在这里发帖子了
- Layer3 OSPF
- SQL Server 2012使用OFFSET/FETCH NEXT分页及性能测试
- 编辑框
- HDU2586 How far away ?(tarjan+并查集离线求lca)
- 简单的ExplosionField记录
- Oracle写没有表可以创建表
- 浅谈Java设计模式(二)抽象工厂模式
- 【SpringMVC学习01】宏观上把握SpringMVC框架
- cocos中的简易绘图
- 关于Spring的69个面试问答——终极列表
- 一个简单的守护进程的编写
- cron表达式详解与案例