HDOJ 4607 - Park Visit
2013-07-26 20:46
363 查看
用树形DP找到这颗树距离最远的两个点....对于一个询问K..若小于最远距离..显然只要走最远的这条边走K-1个边就行了..
当K大于了最远距离..就要去走其他的点...而去其他点必须再回到这个主线..所以要加上(最远距离上点总数-K)*2...
Program:
当K大于了最远距离..就要去走其他的点...而去其他点必须再回到这个主线..所以要加上(最远距离上点总数-K)*2...
Program:
#include<iostream> #include<stack> #include<queue> #include<stdio.h> #include<algorithm> #include<string.h> #include<cmath> #define ll long long #define oo 1000000007 #define MAXN 100010 using namespace std; vector<int> Tree[MAXN]; int dis[MAXN],M; void dfs(int x,int f) { int i,m=Tree[x].size(); dis[x]=1; for (i=0;i<m;i++) if (Tree[x][i]!=f) { dfs(Tree[x][i],x); M=max(M,dis[x]+dis[Tree[x][i]]); dis[x]=max(dis[x],dis[Tree[x][i]]+1); } return; } int main() { int T,i,n,k; scanf("%d",&T); while (~scanf("%d%d",&n,&k)) { for (i=1;i<=n;i++) Tree[i].clear(); for (i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); Tree[x].push_back(y); Tree[y].push_back(x); } memset(dis,0,sizeof(dis)); M=0; dfs(1,0); while (k--) { int x; scanf("%d",&x); if (x<=M) printf("%d\n",x-1); else printf("%d\n",M-1+(x-M)*2); } } return 0; }
相关文章推荐
- hdu-4607-Park Visit
- hdu 4607 ( Park Visit )
- hdu 4607 Park Visit
- hdu - 4607 - Park Visit
- 2013 多校联合 H Park Visit (hdu 4607)
- Hdu 4607 Park Visit【思维+求树的最长链】好题!好题~
- HDU-4607 Park Visit bfs | DP | dfs
- HDU 4607 Park Visit【思维】【图论】【搜索】
- 图的深搜和广搜模板(多校联合第一场Park Visit)
- 【HDOJ】1493 QQpet exploratory park
- HDOJ 4607 Park Visit
- HDOJ 4607 Park Visit
- hdu4607:Park Visit
- HDOJ 题目4607 Park Visit(树的直径)
- Hdoj 1493 QQpet exploratory park
- HDU4607(Park Visit)2013多校1-树的直径
- HDOJ-----4607
- Park Visit(树型DP)
- HDOJ 4607 - Park Visit
- hdoj 4607 Park Visit 【树的直径的应用 求一棵树中经过k个点需要走的最短距离】