hdu 2196(树的最长链)

题意:输出从一颗树中所有结点出发可以走的最长的路。

思路:先找到树上最长链然后判断两个端点中到每个结点远的距离就是答案。

代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <set>
 8 #include <map>
 9 #include <string>
10 #include <math.h>
11 #include <stdlib.h>
12 #include <time.h>
13 #define MP(a, b) make_pair(a, b)
14 #define PB(a) push_back(a)
15 using namespace std;
16 
17 const int LEN = 10010;
18 const int INF = 0x3f3f3f3f;
19 typedef pair<int, int> pii;
20 vector<pii> Map[LEN];
21 int n, vis[LEN], dis[LEN], disa[LEN];
22 
23 
24 int bfs(int v){
25     queue<int> q;
26     memset(vis, 0, sizeof vis);
27     memset(dis, 0, sizeof dis);
28     q.push(v);
29     vis[v] = 1;
30     while(!q.empty()){
31         int nv = q.front(); q.pop();
32         for(int i=0; i<Map[nv].size(); i++){
33             int x = Map[nv][i].first;
34             if(!vis[x]){
35                 vis[x] = 1;
36                 dis[x] = dis[nv] + Map[nv][i].second;
37                 q.push(x);
38             }
39         }
40     }
41     int maxv = -INF, maxn;
42     for(int i=0; i<n; i++){
43         if(maxv < dis[i]){
44             maxv = dis[i];
45             maxn = i;
46         }
47     }
48     return maxn;
49 }
50 
51 int main()
52 {
53  //   freopen("in.txt","r",stdin);
54  //   freopen("out.txt","w",stdout);
55     
56     int a, b;
57     while(scanf("%d", &n)!=EOF){
58         for(int i=0; i<LEN; i++) Map[i].clear();
59         for(int i=1; i<n; i++){
60             scanf("%d%d", &a, &b);
61             a--;
62             Map[i].PB(MP(a, b));
63             Map[a].PB(MP(i, b));
64         }
65         int vexa = bfs(0);
66         int vexb = bfs(vexa);
67         for(int i=0; i<n; i++)disa[i] = dis[i];
68         bfs(vexb);
69         for(int i=0; i<n; i++){
70             printf("%d\n", max(disa[i], dis[i]));
71         }
72     }
73     return 0;
74 }
View Code

 

转载于:https://www.cnblogs.com/shu-xiaohao/p/3703558.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值