【WikiOI】【P1036】【商务旅行】【题解】【LCA】

来源:互联网 发布:imax影片数据 编辑:程序博客网 时间:2024/06/06 20:31

传送门:www.wikioi.com/problem/1036/

滚回新校1week回来做点康复训练,话说进队爷们都在隔壁虐题,我等蒟蒻被题虐……

又是LCA,我TM就是链剖!!

Code:

//ID:zky#include<vector>#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int maxn=30010;typedef pair<int,int> pii;int w[maxn],fa[maxn],son[maxn],top[maxn],dep[maxn],siz[maxn],z;vector<int>G[maxn];void add(int u,int v){G[u].push_back(v);G[v].push_back(u);}void dfs(int u){son[u]=0;siz[u]=1;for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v!=fa[u]){fa[v]=u;dep[v]=dep[u]+1;dfs(v);siz[u]+=siz[v];if(siz[son[u]]<siz[v])son[u]=v;}}}void build(int u,int tp){w[u]=++z;top[u]=tp;if(son[u])build(son[u],tp);for(int i=0;i<G[u].size();i++){int v=G[u][i];if(v!=fa[u]&&v!=son[u])build(v,v);}}int abs(int x){return x>0?x:-x;}int len(int u,int v){int ans=0;while(top[u]!=top[v]){if(dep[top[u]]>dep[top[v]]){int a=dep[u],b=dep[top[u]];ans+=abs(a-b)+1;u=fa[top[u]];}else{int a=dep[v],b=dep[top[v]];ans+=abs(a-b)+1;v=fa[top[v]];}}ans+=abs(dep[u]-dep[v]);return ans;}int q[maxn];int n,m;int main(){scanf("%d",&n);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);}dfs(1);build(1,1);scanf("%d",&m);scanf("%d",&q[1]);long long  ans=0;for(int i=2;i<=m;i++){scanf("%d",&q[i]);ans+=len(q[i-1],q[i]);}cout<<ans<<endl;return 0;}


0 0
原创粉丝点击