洛谷 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 }
View Code

 

posted @ 2017-09-11 14:34  Alex丶Baker  阅读(101)  评论(0编辑  收藏  举报