zoukankan      html  css  js  c++  java
  • 转 蓝桥杯 历届试题 大臣的旅费 [ dfs 树的直径 ]

    题解:

    求树的直径。

    转一篇博客:http://www.cnblogs.com/hanyulcf/archive/2010/10/23/tree_radius.html

    树的直径是指树的最长简单路。求法: 两遍BFS :先任选一个起点BFS找到最长路的终点,再从终点进行BFS,则第二次BFS找到的最长路即为树的直径;
                  原理: 设起点为u,第一次BFS找到的终点v一定是树的直径的一个端点
                  证明: 1) 如果u 是直径上的点,则v显然是直径的终点(因为如果v不是的话,则必定存在另一个点w使得u到w的距离更长,则于BFS找到了v矛盾)
                          2) 如果u不是直径上的点,则u到v必然于树的直径相交(反证),那么交点到v 必然就是直径的后半段了
                           所以v一定是直径的一个端点,所以从v进行BFS得到的一定是直径长度

                  相关题目有TOJ1056,TOJ3517.

    508294 609738062@qq.com 大臣的旅费 04-07 20:23 1.113KB C++ 正确 100 0ms 1.238MB 评测详情

    代码转自:

    http://blog.csdn.net/buctyyzyn/article/details/44886697

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<vector>
     6 using namespace std;
     7 #define MAXN 10100
     8 
     9 struct Edge{
    10     int v,w;
    11     Edge(int vv,int ww):v(vv),w(ww){}
    12 };
    13 
    14 int n;
    15 int dist[MAXN],max_len,End;
    16 vector<vector<Edge> >G;
    17 
    18 void dfs(int u,int father,int len)
    19 {
    20     if(len>max_len)max_len=len,End=u;
    21     for(int i=0;i<G[u].size();i++){
    22         int v=G[u][i].v,w=G[u][i].w;
    23         if(v==father)continue;
    24         dist[v]=max(dist[v],len+w);
    25         dfs(v,u,len+w); 
    26     }
    27 }
    28 
    29 int main()
    30 {
    31     int u,v,w;
    32     while(~scanf("%d",&n)){
    33         G.clear();
    34         G.resize(n+2);
    35         for(int i=1;i<n;i++){
    36             scanf("%d%d%d",&u,&v,&w);
    37             G[u].push_back(Edge(v,w));
    38             G[v].push_back(Edge(u,w));
    39         }
    40         memset(dist,0,sizeof(dist));
    41         max_len=0;
    42         dfs(1,-1,0);
    43         memset(dist,0,sizeof(dist));
    44         max_len=0;
    45         dfs(End,-1,0);
    46         int ans=0;
    47         ans=max_len;
    48        // for(int i=1;i<=n;i++){
    49         //    ans=max(ans,dist[i]);
    50        // }
    51         int tt=0;
    52         for(int i=1;i<=ans;i++)
    53         tt+=(10+i);
    54         printf("%d
    ",tt);
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/njczy2010/p/4399321.html
Copyright © 2011-2022 走看看