码迷,mamicode.com
首页 > 其他好文 > 详细

hdu--2196--树上某点到其余结点的最远距离

时间:2014-09-19 23:49:26      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   div   

这题 很多人都是用树形dp进行2次dfs做的...

我看了他们的解题报告 并没有完全搞懂=-= 我太白痴了 伤..

这边 我的解法 利用了一个很重要的性质---树的直径--树上任意两点间的最远距离

而同时 将这个直径上的两点x , y确定后 那么 整个树上结点的dist[ i ]也就可以确定了

max( dist[i][x] , dist[i][y] ) 要么是到x的距离 要么是到y的距离

至于 怎么找出这个直径呢?

这也是个要记住的地方 我们可以任意确定一个根结点开始bfs 得到距离它最远的结点编号 那么这个结点就是 树中直径的某一端点

然后再bfs这个得到的端点 可以得到直径的另一端点 最后Bfs这个端点  同时在这对于直径端点的bfs中  分别用不同数组记录下距离

最后用max输出

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int cnt;
 8 const int size = 10010;
 9 struct data
10 {
11     int to;
12     int val;
13     int next;
14 }node[size*2];
15 int head[size];
16 int dist1[size];
17 int dist2[size];
18 bool vis[size];
19 
20 void init( )
21 {
22     memset( head , -1 , sizeof(head) );
23     memset( dist1 , 0 , sizeof(dist1) );
24     memset( dist2 , 0 , sizeof(dist2) );
25 }
26 
27 void addEdge( int from , int to , int dist )
28 {
29     node[cnt].to = to;
30     node[cnt].val = dist;
31     node[cnt].next = head[from];
32     head[from] = cnt ++;
33 }
34 
35 int bfs( int num , int* dist )
36 {
37     int ans , now , len;
38     len = -1;
39     memset( vis , false , sizeof(vis) );
40     queue<int>q;
41     q.push(num);
42     vis[num] = 1;
43     while( !q.empty() )
44     {
45         now = q.front();
46         q.pop();
47         if( dist[now] > len )
48         {
49             len = dist[now];
50             ans = now;
51         }
52         for( int i = head[now] ; ~i ; i = node[i].next )
53         {
54             int to = node[i].to;
55             int val = node[i].val;
56             if( !vis[to] )
57             {
58                 vis[to] = true;
59                 q.push(to);
60                 dist[to] = dist[now] + val;
61             }
62         }
63     }
64     return ans;
65 }
66 
67 int main()
68 {
69     cin.sync_with_stdio(false);
70     int n , x , y , point;
71     while( cin >> n )
72     {
73         cnt = 0;
74         init( );
75         for( int i = 2 ; i<=n ; i++ )
76         {
77             cin >> x >> y;
78             addEdge( i , x , y );
79             addEdge( x , i , y );
80         }
81         point = bfs( 1 , dist1 );
82         memset( dist1 , 0 , sizeof(dist1) );
83         point = bfs( point , dist1 );
84         point = bfs( point , dist2 );
85         for( int i = 1 ; i<=n ; i++ )
86         {
87             cout << max( dist1[i] , dist2[i] ) << endl;
88         }
89     }
90     return 0;
91 }
View Code

 

today:

  人们说

  当遇上你的挚爱时

  时间会暂停

  那是真的

  但人们没有告诉你

  当时针再度恢复转动

  它会无比飞快

  让人无法追上

   

 

hdu--2196--树上某点到其余结点的最远距离

标签:style   blog   http   color   io   os   ar   for   div   

原文地址:http://www.cnblogs.com/radical/p/3982648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!