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最多花费的路费是多少。

    样例输入1
    5
    1 2 2
    1 3 1
    2 4 5
    2 5 4
    样例输出1
    135
    输出格式

    大臣J从城市4到城市5要花费135的路费。

    思路:从每个结点出发进行dfs,找到从该节点出发最大的路径,不断更新这个值,
    最后求出最大的旅费
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int array[101][101];//距离
     4 int array1[101][101];//记录路线是否走过。
     5 long distance1=0;
     6 long maxnum=0;
     7  int n;
     8 int DFS(int city)//参数表示为城市
     9 {
    10     int sum=0;//记录从city出发还有城市可以到达吗
    11     for(int i=1;i<=n;i++){
    12        if(array1[city][i]==0 && i!=city && array[city][i]!=0){
    13         sum++;
    14        }
    15     }
    16     if(sum==0){
    17     if(distance1>maxnum){
    18         maxnum=distance1;
    19     }
    20     }else{
    21      for(int i=1;i<=n;i++){
    22        if(array1[city][i]==0 && i!=city && array[city][i]!=0){
    23         distance1+=array[city][i];
    24         array1[city][i]=1;
    25         array1[i][city]=1;
    26         DFS(i);
    27         distance1-=array[city][i];
    28         array1[city][i]=0;
    29          array1[i][city]=0;
    30        }
    31     }
    32     }
    33 
    34 }
    35 int main()
    36 {
    37 
    38    cin >> n;
    39    memset(array,0,sizeof(array));
    40    memset(array1,0,sizeof(array1));
    41    int start;
    42    int end;
    43    int length;
    44    for(int i=0;i<n-1;i++)
    45    {
    46        cin>> start >> end;
    47         cin >> array[start][end];
    48         array[end][start]=array[start][end];
    49    }
    50     for(int i=1;i<=n;i++)
    51     {
    52         DFS(i);
    53     }
    54    // cout <<maxnum<< endl;
    55     int money=0;
    56     for(int i=1;i<=maxnum;i++){
    57         money+=(i+10);
    58     }
    59     cout << money << endl;
    60     return 0;
    61 }

    最后一组测试数据没通过,原因是N太大,数组开辟不了那么大。。。

    用vector实现即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct node{
     4  int v,cost;
     5  int in;//表示该路是否走过
     6 };
     7 vector <node> array[10010];
     8 void add(int u,int v,int cost)
     9 {
    10     node temp;
    11     temp.v=v;
    12     temp.cost=cost;
    13     temp.in=0;
    14     array[u].push_back(temp);
    15 }
    16 
    17 long distance1=0;
    18 long maxnum=0;
    19  int n;
    20 int DFS(int city)//参数表示为城市
    21 {
    22     int sum=0;//记录从city出发还有城市可以到达吗
    23     for(int i=1;i<=n;i++){
    24       for(int i=0;i<array[city].size();i++){
    25        if(array[city][i].in==0){
    26         sum++;
    27        }
    28     }
    29     }
    30     if(sum==0){
    31     if(distance1>maxnum){
    32         maxnum=distance1;
    33     }
    34     }else{
    35     for(int i=0;i<array[city].size();i++){
    36        if(array[city][i].in==0){//该路径还没有走过
    37          distance1+=array[city][i].cost;
    38          array[city][i].in=1;//该路径已经走过
    39          for(int j=0;j<array[array[city][i].v].size();j++){
    40             if(array[array[city][i].v][j].v==city){//路径uv和粗是等价的都要修改
    41                 array[array[city][i].v][j].in=1;
    42             }
    43          }
    44          DFS(array[city][i].v);
    45          distance1-=array[city][i].cost;
    46          array[city][i].in=0;
    47           for(int j=0;j<array[array[city][i].v].size();j++){
    48             if(array[array[city][i].v][j].v==city){
    49                 array[array[city][i].v][j].in=0;
    50             }
    51          }
    52        }
    53     }
    54     }
    55 }
    56 int main()
    57 {
    58    cin >> n;
    59    memset(array,0,sizeof(array));
    60    int start;
    61    int ends;
    62    int cost;
    63    int length;
    64    for(int i=0;i<n-1;i++)
    65    {
    66        cin>> start >> ends >> cost;
    67        add(start,ends,cost);
    68        add(ends,start,cost);
    69    }
    70     for(int i=1;i<=n;i++)
    71     {
    72         DFS(i);
    73     }
    74     int money=0;
    75     for(int i=1;i<=maxnum;i++){
    76         money+=(i+10);
    77     }
    78     cout << money << endl;
    79     return 0;
    80 }
  • 相关阅读:
    几个不错的学习网址不断更新中
    重构之美-跨越Web标准,触碰语义网[分离:通用也许是个美丽陷阱]
    在APP中分享小程序和在企微中分享小程序到对话聊天框需要做哪些配置
    第三方平台授权小程序遇到的问题
    第三方授权小程序,将小程序代码推到第三方平台流程以及需要配置哪些东西
    html5专题页
    lua字符串格式化多参用法
    lua三目运算符逻辑盲点
    部分数学符号
    常用软件链接
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10461512.html
Copyright © 2011-2022 走看看