HDU4607+BFS

 1 /*
 2 bfs+求树的直径
 3 关键:if k<=maxs+1 直接输出k-1;
 4     else: k肯定的是包括最长路。先从最长路的起点出发,再走分支,最后到达最长路的终点。
 5             因此是2*(k-(maxs+1))+maxs;
 6 */
 7 #include<stdio.h>
 8 #include<string.h>
 9 #include<stdlib.h>
10 #include<algorithm>
11 #include<iostream>
12 #include<queue>
13 #include<map>
14 #include<math.h>
15 using namespace std;
16 typedef long long ll;
17 //typedef __int64 int64;
18 const int maxn = 100005;
19 const int inf = 0x7fffffff;
20 const double pi=acos(-1.0);
21 const double eps = 1e-8;
22 struct Node{
23     int v,next;
24 }edge[ maxn<<1 ];
25 int cnt,head[ maxn ];
26 int vis[ maxn ],dis[ maxn ];
27 int maxs,maxNode;
28 void init(){
29     cnt = 0;
30     memset( head,-1,sizeof( head ) );
31 }
32 void addedge( int a,int b ){
33     edge[ cnt ].v = b;
34     edge[ cnt ].next = head[ a ];
35     head[ a ] = cnt++;
36     
37     edge[ cnt ].v = a;
38     edge[ cnt ].next = head[ b ];
39     head[ b ] = cnt++;
40 }
41 void bfs( int s,int n ){
42     memset( vis,0,sizeof( vis ) );
43     vis[ s ] = 1;
44     queue<int>q;
45     q.push( s );
46     //for( int i=0;i<=n;i++ )
47         //dis[ i ] = inf;
48     dis[ s ] = 0;
49     maxs = 0;
50     while( !q.empty() ){
51         int cur = q.front();
52         q.pop();
53         if( dis[ cur ]>maxs ){
54             maxs = dis[ cur ];
55             maxNode = cur;
56         }
57         //maxs = max( maxs,dis[ cur ] );
58         for( int i=head[ cur ];i!=-1;i=edge[ i ].next ){
59             int v = edge[ i ].v;
60             if( vis[ v ]==1 ) continue;
61             vis[ v ] = 1;
62             dis[ v ] = dis[ cur ]+1;
63             q.push( v );
64         }    
65     }
66     return ;
67 }
68 int main(){
69     int T;
70     scanf("%d",&T);
71     while( T-- ){
72         int n,m;
73         scanf("%d%d",&n,&m);
74         int a,b;
75         init();
76         int N = n-1;
77         while( N-- ){
78             scanf("%d%d",&a,&b);
79             addedge( a,b );
80         }
81         bfs( 1,n );
82         bfs( maxNode,n );
83         //maxs=the R of the tree
84         while( m-- ){
85             scanf("%d",&b);
86             if( b<=maxs+1 ) printf("%d
",b-1);
87             else printf("%d
",2*(b-maxs-1)+maxs);
88         }
89     }
90     return 0;
91 }
View Code
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/3250106.html