hdu 2586 lca离线tarjan
2014-09-29 20:29
288 查看
http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 参考博客
//parent为并查集,FIND为并查集的查找操作
//QUERY为询问结点对集合
//TREE为基图有根树
Tarjan(u)
visit[u] =
true
for
each (u, v) in
QUERY
if
visit[v]
ans(u, v) = FIND(v)
for
each (u, v) in
TREE
if
!visit[v]
Tarjan(v)
parent[v] = u
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; const int maxn=40005; struct node{ int e,v; int next; }edge[2*maxn]; int head[2*maxn]; int cnt; int f[maxn]; int lca[maxn]; int x[maxn],y[maxn]; int n,m; int dis[maxn]; int vis[maxn]; void init(){ memset(head,-1,sizeof(head)); memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(lca,0,sizeof(lca)); memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); cnt=0; } void add(int a,int b,int c) { edge[cnt].e=b; edge[cnt].v=c; edge[cnt].next=head[a]; head[a]=cnt++; edge[cnt].e=a; edge[cnt].v=c; edge[cnt].next=head[b]; head[b]=cnt++; } int find(int x) { if(f[x]!=x) { return f[x]=find(f[x]); } return f[x]; } void tarjan(int k) { vis[k]=1; f[k]=k; for(int i=1;i<=m;i++) { if(x[i]==k&&vis[y[i]]) lca[i]=find(y[i]); if(y[i]==k&&vis[x[i]]) lca[i]=find(x[i]); } for(int i=head[k];i!=-1;i=edge[i].next) { if(!vis[edge[i].e]) { dis[edge[i].e]=dis[k]+edge[i].v; tarjan(edge[i].e); f[edge[i].e]=k; } } } int main(){ int T,a,b,c; scanf("%d",&T); while(T--) { init(); scanf("%d%d",&n,&m); for(int i=1;i<n;i++) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } for(int i=1;i<=m;i++) { scanf("%d%d",&x[i],&y[i]); } tarjan(1); for(int i=1;i<=m;i++) { printf("%d\n",dis[x[i]]+dis[y[i]]-2*dis[lca[i]]); } } return 0; }
//parent为并查集,FIND为并查集的查找操作
//QUERY为询问结点对集合
//TREE为基图有根树
Tarjan(u)
visit[u] =
true
for
each (u, v) in
QUERY
if
visit[v]
ans(u, v) = FIND(v)
for
each (u, v) in
TREE
if
!visit[v]
Tarjan(v)
parent[v] = u
相关文章推荐
- HDU2586 How far away ?(最近公共祖先lca,离线Tarjan,最短路)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- HDU 2586 How far away? LCA 离线tarjan
- HDU 2586 How far away ? LCA离线tarjan思想
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ? (LCA 离线tarjan)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- 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 ?(tarjan离线做法求lca)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)
- hdu 2586 How far away ?(在线LCA+离线Tarjan)