标签:
1 4 2 3 2 1 2 4 2 2 4
1 4
题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距
离是多少?(每条边的长度为1)
解析:求出树的最长链,若最长链的长度为len,如果K<=len+1,那么
答案就是K-1,否则就是(K-len-1)*2+len(这个可以自己面图想想)。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=100010;
int n,m,a[maxn];
vector <int> G[maxn];
void initial()
{
for(int i=0;i<maxn;i++) G[i].clear();
memset(a,0,sizeof(a));
}
void input()
{
int u,v;
scanf("%d %d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
}
void dfs(int u,int v,int depth)
{
a[v]=depth;
for(int i=0;i<G[v].size();i++)
{
int vv=G[v][i];
if(vv==u) continue;
dfs(v,vv,depth+1);
}
}
void solve()
{
int Max=-1,c=0,t;
dfs(-1,1,0);
for(int i=1;i<=n;i++) if(Max<a[i]) Max=a[i],c=i;
Max=-1;
memset(a,0,sizeof(a));
dfs(-1,c,0);
for(int i=1;i<=n;i++) Max=max(Max,a[i]);
for(int i=0;i<m;i++)
{
scanf("%d",&t);
if(t<=Max+1) printf("%d\n",t-1);
else printf("%d\n",2*(t-Max-1)+Max);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
initial();
input();
solve();
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/u012596172/article/details/43054519