待完成

题目:http://codevs.cn/problem/1036/

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;

const int maxSize=30000,maxN=20;
vector <int> M[maxSize+5];
int dis[maxSize+5],deep1[maxSize+5],anc[maxSize+5][maxN+2];
int n,m;

void dfs(int x,int fa)
{
	int i,y;
	
	for (i=0;i<M[x].size();i++)
	{
		y=M[x][i];
		if (y!=fa)
		{
			dis[y]=dis[x]+1;
			deep1[y]=deep1[x]+1;
			anc[y][0]=x;
			dfs(y,x);
		}
	}
}

void Initlca()
{
	int i,j;
	
	for (i=1;i<=n;i++)
		for (j=1;j<=maxN;j++)
			anc[i][j]=anc[anc[i][j-1]][j-1];
}

int lca(int x,int y)
{
	int i;
	
	if (deep1[x]<deep1[y])
		swap(x,y);
	for (i=maxN;i>=0;i--)
		if (deep1[anc[x][i]]>=deep1[y])
			x=anc[x][i];
	if (x==y)	return x;
	
	for (i=maxN;i>=0;i--)
		if (anc[x][i]!=anc[y][i])
		{
			x=anc[x][i];
			y=anc[y][i];
		}
	return anc[x][0];
}

int main()
{
	int i,x,y,z,ans=0;
	
	freopen("a.txt","r",stdin);
	scanf("%d",&n);
	for (i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		M[x].push_back(y);
		M[y].push_back(x);
	}
	dfs(1,1);
	Initlca();
	scanf("%d",&m);
	x=1;
	for (i=0;i<m;i++)
	{
		scanf("%d",&y);
		z=lca(y,x);
		ans=ans+dis[x]+dis[y]-2*dis[z];
		x=y;
	}
	printf("%d\n",ans);
	
	return 0;
}


猜你喜欢

转载自blog.csdn.net/scutbenson/article/details/78525849