首页 > 其他分享 >ACWing1207_大臣的旅费(bfs)

ACWing1207_大臣的旅费(bfs)

时间:2024-11-01 19:47:38浏览次数:5  
标签:11 int 城市 花费 TT bfs ACWing1207 旅费 首都

有一些自己的理解不知道大家能不能看懂

1207. 大臣的旅费 - AcWing题库高质量的算法题库icon-default.png?t=O83Ahttps://www.acwing.com/problem/content/1209/

很久以前,TT 王国空前繁荣。

为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。

为节省经费,TT 国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。

同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

JJ 是 TT 国重要大臣,他巡查于各大城市之间,体察民情。

所以,从一个城市马不停蹄地到另一个城市成了 JJ 最常做的事情。

他有一个钱袋,用于存放往来城市间的路费。

聪明的 JJ 发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关。

具体来说,一段连续的旅途里,第 11 千米的花费为 1111,第 22 千米的花费为 1212,第 33 千米的花费为 1313,…,第 xx 千米的花费为 x+10x+10。

也就是说,如果一段旅途的总长度为 11 千米,则刚好需要花费 1111,如果一段旅途的总长度为 22 千米,则第 11 千米花费 1111,第 22 千米花费 1212,一共需要花费 11+12=2311+12=23。

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

输入格式

输入的第一行包含一个整数 nn,表示包括首都在内的 TT 王国的城市数。

城市从 11 开始依次编号,11 号城市为首都。

接下来 n−1n−1 行,描述 TT 国的高速路(TT 国的高速路一定是 n−1n−1 条)。

每行三个整数 Pi,Qi,DiPi,Qi,Di,表示城市 PiPi 和城市 QiQi 之间有一条双向高速路,长度为 DiDi 千米。

输出格式

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

数据范围

1≤n≤10^ 5  1≤n≤10^5,
1≤Pi,Qi≤n1≤Pi,Qi≤n,
1≤Di≤10001≤Di≤1000

输入样例:
5
1 2 2
1 3 1
2 4 5
2 5 4
输出样例:
135

本题的关键是找到最远的两个点。

所以我们需要找到一个插入点,而本题中的首都就是我们的插入点。我们可以找到一个离首都最远的点作为答案的这段路程的一个起点。当找到这个点之后我们就只要把这个点当作一个首都(把原来的首都当作一个普通的城市即可),去找一个离他最远的地方就可以了。可以这样想,假如原来的首都是A城市,找到了距离A城市最远的城市是B城市,那么我们此时吧B城市看作是一个首都之后(此时把A看作是一个普通的城市就好了),然后我们找到一个距离城市B最远的一个城市C(如果城市B,C是在城市A的两侧,这样就会很容易想通了,如果B,C在同一侧,那么很容易就可以想到城市C就是城市A了)。此时城市BC之间的距离就是本题的答案。

import java.util.*;
import java.io.*;
public class Main{
    static class Node{
        //存放城市的名字以及权值
        int x,v;
        public Node(int x,int v){
            this.x = x;
            this.v = v;
        }
        public Node(){
            
        }
    }
    static int n ; 
    //用数组+链表的形式存储
    static ArrayList<Node>[] nums = new ArrayList[100100];
    //从城市a走到城市b的权值
    static int[] maxs = new int[100100];
    public static void main(String[] args) throws IOException{
        //防止空指针异常
        for(int i = 0 ; i< 100100 ; i++){
            nums[i] = new ArrayList<Node>();
        }
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        int P,Q,D;
        //输入起点,终点,权值
        for(int i = 0 ; i < n - 1 ; i ++){
            P = sc.nextInt();
            Q = sc.nextInt();
            D = sc.nextInt();
            nums[P].add(new Node(Q,D));
            nums[Q].add(new Node(P,D));
        }
        //这一步是为了找到一个离首都最远的地方,存储在maxs里面
        bfs(1,-1,0);
        
        int u = 1;
        for(int i = 1 ; i <= n ; i++){
            if(maxs[u] < maxs[i]){
                u = i;
            }
        }
        
        //找到了之后就以这个最远的地方为起点,找离他最远的地方,即本题的答案
        bfs(u , -1 , 0);
        
        for(int i = 1 ; i <= n ; i++){
            if(maxs[u] < maxs[i]){
                u = i;
            }
        }
        long us = maxs[u];
        long distance = (21 + us) * us / 2;
        System.out.println(distance);
    }
    
    public static void bfs(int begin,int father,int value){
        maxs[begin] = value;
        for(Node node : nums[begin]){
            if(node.x != father){//当1有两个子树2 3 把这两个遍历完即3时,由于是无向图所以他给会默认1也是3的子树,这样的话就形成了闭环,不符合本体的意思
                bfs(node.x , begin , node.v + value);
            }
        }
    }
}

标签:11,int,城市,花费,TT,bfs,ACWing1207,旅费,首都
From: https://blog.csdn.net/2401_84234011/article/details/143439375

相关文章

  • 计蒜客:修建大桥(并查集/DFS/BFS)
     找到有几张连通图即可解决问题。DFS:1#include<bits/stdc++.h>2usingnamespacestd;3intn,m;4intgraph[1005][1005]={0};5boolvisited[1005]={false};6voiddfs(intp){7if(visited[p]){8return;9}10visited[p]......
  • BFS(Breath First Search 广度优先搜索)
    @目录一、知识及框架二、案例说明案例1:使用bfs计算二叉树的最小高度案例2:解开密码锁的最少次数,要求:请写一个算法,初始状态为0000,拨出target的最少次数,其中避免出现deadends中的包含的任意一个死亡密码,如果永远无法拨出target,则返回-1本人其他文章链接一、知识及框架BFS算法都是......
  • 每日OJ题_牛客_AB20走迷宫_BFS_C++_Java
    目录牛客_AB20走迷宫_BFS题目解析C++代码Java代码牛客_AB20走迷宫_BFS走迷宫_牛客题霸_牛客网(nowcoder.com)描述:        给定一个n×m的网格,在网格中每次在不超过边界的情况下可以选择向上、向下、向左、向右移动一格。网格中的一些格子上放置有障碍物,放有......
  • CF35C. Fire Again 题解 bfs求最短路
    题目链接:https://codeforces.com/problemset/problem/35/C视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp/?p=4以每个着火的点为起点求最短路,然后输出任意一个距离值最大的点即可。需要注意的是:本题是文件输入输出。示例程序:#include<bits/stdc++.h>usingnamespace......
  • 【SSL 1823】消灭怪物(非传统BFS)
    题目大意小b现在玩一个极其无聊的游戏,它控制角色从基地出发,一路狂奔夺走了对方的水晶,可是正准备回城时,发现地图上已经生成了n个怪。现在假设地图是二维平面,所有的怪和角色都认为是在这个二维平面的点上。请你帮小b计算一下,从现在角色的位置开始,至少要消灭几个怪才能回到基地(坐......
  • DFS与BFS
    图论:一、图中DFS与BFS数和图的存储方式:m与n^2一个级别属于稠密图,m与n一个级别则属于稀疏图,可以从题目中明显看出来稠密图:邻接矩阵稀疏图:邻接表#include<bits/stdc++.h>usingnamespacestd;constintN=100100;intm,n;inth[N],e[N],ne[N],idx;intq[N],d[N];bool......
  • 01 bfs 学习笔记
    当一张图的边权只有\(0\)和\(1\)时,跑dij的堆优化显得比较累赘。因为只有两个取值,所以取\(0\)的时候在队列前面推进来,反之在后面。其他和dij没什么区别,时间复杂度\(O(m)\),其中\(m\)是边数。相关题目:P4554小明的游戏。点击查看代码voidwork(){ m0(vis);mem(di......
  • 二维 bfs 基础笔记
    一、寻找连通块1.基本思路找到一个未被走过的点,以这个点为起点,将与此点相连的所有点标记为走过,答案数\(+1\)2.代码实现#include<bits/stdc++.h>usingnamespacestd;structp{intx,y;};queue<p>q;intn,m,cnt;//最终答案为cntintdx[]={1,-1,0,0}......
  • 算法笔记(十五)——BFS 解决拓扑排序
    文章目录拓扑排序课程表课程表II火星词典拓扑排序有向无环图(DAG图)有向无环图指的是一个无回路的有向图AOV网:顶点活动图在有向无环图中,用顶点表示一个活动,用边来表示活动的先后顺序的图结构拓扑排序找到一个先后顺序,结果可能不唯一如何拓扑排序?找到一......
  • 数据结构课程设计大项目————迷宫问题(邻接矩阵,prim生成算法,DFS寻路,BFS寻路,路径回溯
    一.前言迷宫问题是数据结构中最值得实践的大项目之一,本文主要讲解思路,提供的代码大部分都有注释(没有的就是太多了懒得写了QAQ)。为了更好的表现效果,该程序使用了easyx可视化,easyx简单易学(大概一天到两天就可以学会),上手简单。该程序由c语言实现,本人水平有限程序可优化空间很大。......