洛谷 P2912 [USACO08OCT]牧场散步Pasture Walking
Posted Alex丶Baker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P2912 [USACO08OCT]牧场散步Pasture Walking相关的知识,希望对你有一定的参考价值。
P2912 [USACO08OCT]牧场散步Pasture Walking
lca
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 1000000 4 int n,num,m,x,y,z,head[maxn],q,size[maxn],top[maxn],deep[maxn],fa[maxn],dis[maxn]; 5 struct Edge{ 6 int to,next,dis; 7 }edge[maxn]; 8 9 void ins(int u,int v,int d) 10 { 11 edge[++num].to=v; 12 edge[num].next=head[u]; 13 edge[num].dis=d; 14 head[u]=num; 15 } 16 17 void dfs(int x) 18 { 19 size[x]=1; deep[x]=deep[fa[x]]+1; 20 for(int i=head[x];i;i=edge[i].next) 21 { 22 int v=edge[i].to; 23 if(fa[x]!=v) 24 { 25 fa[v]=x; 26 dis[v]=dis[x]+edge[i].dis; 27 dfs(v); 28 size[x]+=size[v]; 29 } 30 } 31 } 32 33 void dfs2(int x) 34 { 35 int t=0; if(!top[x]) top[x]=x; 36 for(int i=head[x];i;i=edge[i].next) 37 { 38 int v=edge[i].to; 39 if(fa[x]!=v&&size[t]<size[v]) t=v; 40 } 41 if(t) top[t]=top[x],dfs2(t); 42 for(int i=head[x];i;i=edge[i].next) 43 { 44 int v=edge[i].to; 45 if(fa[x]!=v&&t!=v) dfs2(v); 46 } 47 48 } 49 50 int lca(int x,int y) 51 { 52 while(top[x]!=top[y]) 53 { 54 if(deep[top[x]]<deep[top[y]]) swap(x,y); 55 x=fa[top[x]]; 56 } 57 return deep[x]<deep[y]?x:y; 58 } 59 60 int main() 61 { 62 scanf("%d%d",&n,&q); 63 for(int i=1;i<n;i++) 64 scanf("%d%d%d",&x,&y,&z),ins(x,y,z),ins(y,x,z); 65 dfs(1); dfs2(1); 66 while(q--) 67 { 68 scanf("%d%d",&x,&y); 69 printf("%d\n",dis[x]+dis[y]-(dis[lca(x,y)])*2); 70 } 71 return 0; 72 }
以上是关于洛谷 P2912 [USACO08OCT]牧场散步Pasture Walking的主要内容,如果未能解决你的问题,请参考以下文章
洛谷P2912[USACO08OCT]牧场散步Pasture Walking
P2912 [USACO08OCT]牧场散步Pasture Walking
[USACO08OCT]牧场散步Pasture Walking
[USACO08OCT]牧场散步Pasture Walking