标签:
Sample Input
题意:
给你一个n-1条边n个点的无向图
m个询问,每次询问你从任意一个起点出发路过k个点的最短路径长度
题解:
求出树的直径
在k小于直径上的点时就走直径就好了
大于的话也就是中途多走k-直径点数个点
长度画图就明白了
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include<vector> using namespace std; const int N = 1e5+20, M = 1e6+10, mod = 1e9+7, inf = 1e9+1000; typedef long long ll; int n,m,a[N],mx,d[N],mxx; vector<int >G[N]; void dfs(int x,int fa) { d[x] = d[fa]+1; if(d[x] > mxx) mxx = d[x], mx = x; for(int i=0;i<G[x].size();i++) { if(G[x][i]==fa) continue; dfs(G[x][i],x); } } int main() { int T; scanf("%d",&T); while(T--) { mxx = 0, mx = 0; memset(d,0,sizeof(d)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) G[i].clear(); for(int i=1;i<n;i++) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } dfs(1,0); memset(d,0,sizeof(d)); mxx = 0; dfs(mx,0); int ans = mxx; while(m--) { int x; scanf("%d",&x); if(x<=ans) cout<<x-1<<endl; else cout<<(x-ans)*2+ans-1<<endl; } } }
标签:
原文地址:http://www.cnblogs.com/zxhl/p/5459982.html