zoukankan      html  css  js  c++  java
  • 蓝桥杯 大臣的旅费 (树的直径)

    很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。

    为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

    J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。

    聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。

    J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

    输入的第一行包含一个整数n,表示包括首都在内的T王国的城市数
    城市从1开始依次编号,1号城市为首都。
    接下来n-1行,描述T国的高速路(T国的高速路一定是n-1条)
    每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。

    输出一个整数,表示大臣J最多花费的路费是多少。

    首先根据题目可知,必定是一棵树。然后找出其中两个点之间的距离最大——树的直径

    方法一:

    首先找dfs任意点,找到树的一个端点。

    然后再dfs这个端点。肯定就是直径了

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=10010;
     4 const int inf=0x3f3f3f3f;
     5 int n,head[maxn],cnt,dis[maxn],vis[maxn];
     6 struct node{
     7     int to,w,next;
     8 }edge[maxn<<1];
     9 
    10 void add(int u,int v,int w) {
    11     edge[cnt].to=v;
    12     edge[cnt].w=w;
    13     edge[cnt].next=head[u];
    14     head[u]=cnt++;
    15 }
    16 void init() {
    17     for(int i=1;i<=n;i++) {
    18         dis[i]=inf;
    19         vis[i]=0;
    20     }
    21 }
    22 
    23 void dfs(int st) {
    24     vis[st]=1;
    25     for(int i=head[st];i!=-1;i=edge[i].next) {
    26         if(!vis[edge[i].to]) {
    27             dis[edge[i].to]=dis[st]+edge[i].w;
    28             dfs(edge[i].to);
    29         }
    30     }
    31 }
    32 
    33 int main() {
    34     while(~scanf("%d",&n)) {
    35         int u,v,w;
    36         cnt=0;
    37         memset(head,-1,sizeof(head));
    38         for(int i=0;i<n-1;i++) {
    39             scanf("%d%d%d",&u,&v,&w);
    40             add(u,v,w);
    41             add(v,u,w);
    42         }
    43         init();
    44         dis[1]=0;
    45         dfs(1);
    46         int maxx=-1,st;
    47         for(int i=1;i<=n;i++) {
    48             if(dis[i]>maxx&&dis[i]!=inf) {
    49                 maxx=dis[i];
    50                 st=i;
    51             }
    52         }
    53         init();
    54         dis[st]=0;
    55         dfs(st);
    56         for(int i=1;i<=n;i++) {
    57             if(dis[i]>maxx&&dis[i]!=inf) {
    58                 maxx=dis[i];
    59             }
    60         }
    61         printf("%d
    ",maxx*(maxx+21)/2);
    62     }
    63 }
  • 相关阅读:
    mac 打开文件路径
    js 小技巧
    java 随机数
    sql server 2000 按日期查找
    WML
    Groovy
    Windows Azure Traffic Manager (4) Windows Azure Traffic Manager (4) 循环法和故障转移
    Windows Azure Cloud Service (28) 在Windows Azure发送邮件(中)
    [New Portal] Windows Azure Cloud Service (30) 新的Windows Azure SDK 1.7和新的Windows Azure Managemeng Portal
    Windows Azure Traffic Manager (3) Windows Azure Traffic Manager (3) 创建流量管理器策略和性能负载平衡
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/10391584.html
Copyright © 2011-2022 走看看