hdu 4607 Park Visit (dfs)
2013-07-24 15:29
316 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607
首先如果k小于等于直径长度,那么答案为k−1。如果k大于直径长度,设直径长度为r,那么答案为r−1+(k−r)∗2。
View Code
首先如果k小于等于直径长度,那么答案为k−1。如果k大于直径长度,设直径长度为r,那么答案为r−1+(k−r)∗2。
#include <cstdio> #include <cmath> #include <algorithm> #include <iostream> #include <cstring> #include <queue> #include <vector> #define maxn 105000 using namespace std; const int INF = 0x3f3f3f; vector<int> G[maxn]; int N,M; int maxdeep,point; bool vis[maxn]; void dfs(int u,int deep){ if(maxdeep < deep){ maxdeep = deep; point = u; } for(int i=0;i<G[u].size();i++){ int v = G[u][i]; if(!vis[v]){ vis[v] = true; //printf("u,v %d %d\n",u,v);jf dfs(v,deep+1); } } } int main() { //if(freopen("input.txt","r",stdin)== NULL) {printf("Error\n"); exit(0);} int T; cin>>T; while(T--){ cin>>N>>M; if(N == 1){ for(int i=1;i<=M;i++){ int K; scanf("%d",&K); printf("0\n"); } continue; } for(int i=1;i<=N;i++) G[i].clear(); for(int i=1;i<=N-1;i++){ int a,b; scanf("%d %d",&a,&b); G[a].push_back(b); G[b].push_back(a); } memset(vis,0,sizeof(vis)); maxdeep = 0; point = 0; vis[1] = true; dfs(1,0); memset(vis,0,sizeof(vis)); dfs(point,0); for(int i=1;i<=M;i++){ int K; scanf("%d",&K); if(maxdeep >= K-1) printf("%d\n",K-1); else printf("%d\n",maxdeep + 2 * (K - 1 - maxdeep)); } } }
View Code
相关文章推荐
- HDU 4607 Park Visit 两次DFS求树直径
- HDU - 4607 Park Visit
- hdu 4607 Park Visit(bfs)
- hdu 4607 Park Visit 贪心
- HDU 4607 Park Visit 求树的直径
- HDU 4607 Park Visit 解题报告
- hdu 4607 Park Visit
- hdu 4607 Park Visit(树型DP)
- hdu 4607 park visit 2013多校联合训练第一场
- HDU 4607 Park Visit (树的直径)
- HDU 4607 Park Visit(树的直径)
- hdu 4607 Park Visit 求树的直径
- 2013 多校第一场 hdu 4607 Park Visit
- HDU-4607 Park Visit bfs | DP | dfs
- hdu 4607 Park Visit
- hdu 4607——Park Visit(暑假第一次多校)
- 【HDU】4607 - Park Visit(树的直径)
- HDU 4607 Park Visit (树的直径)
- hdu 4607 Park Visit (树的直径)
- hdu-4607-Park Visit