题目大意:
给你一颗树,树的边权值都为1,给你一个数K让你在树上走K个点的最小花费。
思路:
贪心 这条路一定是在树的直径上,如果树的直径不够长走分支的花费是一定的。
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
vector<vector<int> > v;
int dp[100005];
int maxxi,maxx;
void dfs(int now,int fa,int step){
dp[now] = step;
if(dp[now]>maxx){
maxx = dp[now];maxxi = now;
}
if(fa!=-1&&v[now].size()==1)return;
for(int i=0;i<v[now].size();i++){
int next = v[now][i];
if(next!=fa)
dfs(next,now,step+1);
}
}
int main(){
int T;scanf("%d",&T);
while(T--){
v.clear();maxx = 0;maxxi = -1;memset(dp,0,sizeof(dp));
int num,k;scanf("%d%d",&num,&k);
v.resize(num+3);
for(int i=1;i<num;i++){
int a,b;scanf("%d%d",&a,&b);
v[a].push_back(b);v[b].push_back(a);
}
dfs(1,-1,0);maxx = 0;memset(dp,0,sizeof(dp));
dfs(maxxi,-1,0);
for(int i=0;i<k;i++){
int tem;scanf("%d",&tem);tem--;
if(tem<=maxx)printf("%d\n",tem);
else{
printf("%d\n",maxx+(tem-maxx)*2);
}
}
}
}