蓝桥杯 大臣的旅费_树的最长度_两次DFS

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <functional>
#include <vector>
using namespace std;

const int maxn = 1000000 + 10;
const int INF = 10000000;
int n;
bool used[maxn];
vector<int> G[maxn];
vector<int> E[maxn];     //边 

int d[maxn];

void init()
{
    memset(used, 0, sizeof(used));
}

void dfs(int u)
{
    used[u] = true;

    int size = G[u].size();

    for (int i = 0; i < size; i++)
    {
        int v = G[u][i];            //得到这个点的临边
        if (!used[v]) {
            d[v] = d[u] + E[u][i];  //走临边的情况
            dfs(v);                 //dfs()临边
        }
    }
}

void solve()
{
    cin >> n;

    int u, v, w;

    for (int i = 0; i < n - 1; i++) {
        scanf("%d%d%d", &u, &v, &w);
        G[u - 1].push_back(v - 1);
        E[u - 1].push_back(w);

        G[v - 1].push_back(u - 1);
        E[v - 1].push_back(w);
    }

    //第一遍
    init();
    fill(d, d + n, INF);
    d[0] = 0;

    //递归找到最远路
    dfs(0);
    int start = 0;        //得到最大值的下标
    int max = -1;

    //为了找到最远路
    for (int i = 0; i < n; i++)
    {
        if (d[i] > max && d[i] != INF) {  //走过
            max = d[i];
            start = i;    //找到最远路
        }
    }

    //http://blog.csdn.net/chao1983210400/article/details/26447001
    //树的最长路求法:两次dfs,从任意点出发一次dfs找到的最远结点A,再从A开始进行一次dfs找到的最远点既为树的的直径。
    //第二遍
    //从最远路出发,dfs找到的最远点一定是树的直径
    //现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,
    //即用两遍广搜就可以找出树的最长路
    init();
    for (int i = 0; i < n; i++) {
        d[i] = (i == start ? 0 : INF);
    }
    dfs(start);     

    int ans = -1;
    for (int i = 0; i < n; i++) {
        if (d[i] > ans && d[i] != INF) {
            ans = d[i];
        }
    }

    ans = 10 * ans + ans * (ans + 1) / 2;

    cout << ans << endl;

}

int main()
{
    solve();
    return 0;
}
时间: 2024-10-26 20:34:48

蓝桥杯 大臣的旅费_树的最长度_两次DFS的相关文章

蓝桥杯大臣的旅费

问题描述请大家登陆蓝桥杯官网看吧.在这里就不贴了. 起初我用的是邻接矩阵存储图.最后一个数据n为10000,致使内存超标,运行错误.用邻接表存储图可解决此类问题.(可是到比赛时我们无法知道内存是否超标,那该怎么处理呢). 若你对从每个结点对树进行深度优先搜索的话,那么将会运行超时. 看了别人的代码提示,我产生了一个思路.对树进行2次深度遍历就可以了. 第一次遍历找出一个包含在最长路中的终端结点,从该终端结点对树进行深度优先搜索就可以找到最长路了. 代码如下: #include <iostream

蓝桥杯 大臣的旅费

问题描写叙述 非常久曾经,T王国空前繁荣.为了更好地管理国家,王国修建了大量的高速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得不论什么一个大城市都能从首都直接或者通过其它大城市间接到达. 同一时候,假设不反复经过大城市.从首都到达每一个大城市的方案都是唯一的. J是T国重要大臣,他巡查于各大城市之间,体察民情. 所以,从一个城市马不停蹄地到还有一个城市成了J最常做的事情.他有一个钱袋,用于存放往来城市间的路费. 聪明的J发现,假设不在某个

【蓝桥杯】校门外的树

原文地址:http://leihuang.net/2014/05/19/List-Interviews/ 单链表的一些常见面试题汇总 单链表反转/逆序 求单链表倒数第N个数 找到单链表的中间结点 如何判断链表是否有环的存在 单链表建环,无环链表变有环 如何知道环的长度? 如何找出环的连接点在哪里? 删除单链表中的重复元素 下面我先简单叙述一下每道题的思路,然后把实现的程序一起贴出来,不会讲得太细,我觉得只要有了思路之后,接下来的难点就是语言上的一些细节问题了,这个不自己去实现,听别人讲是体会不到

蓝桥杯 - 操作格子 (线段树)

题目传送:操作格子 思路:简单线段树,单点更新,区间求和以及最值 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map>

蓝桥杯java 基础练习 Huffuman树

问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中.这个过程的费用记为pa + pb. 2. 重复步骤1,直到{pi}中只剩下一个数. 在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用. 本题任务:对于给定的一个数列

[蓝桥杯][基础练习VIP]Huffuman树

时间限制: 1Sec 内存限制: 128MB 提交: 61 解决: 43 题目描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0,  p1,  -,  pn-1},用这列数构造Huffman树的过程如下: 1.  找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中.这个过程的费用记为pa  +  pb. 2.  重复步骤1,直到{pi}中只剩下一个数. 在上面的操作过程中

蓝桥杯 历届试题 小朋友排队 树状数组实现

历届试题 小朋友排队 时间限制:1.0s   内存限制:256.0MB 问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推.当要求某个小朋友第k次交换时,他的不高兴程度增加k. 请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和

[bzoj3991][SDOI2015]寻宝游戏_树链的并_倍增lca_平衡树set

寻宝游戏 bzoj-3991 SDOI-2015 题目大意:题目链接. 注释:略. 想法:我们发现如果给定了一些点有宝物的话那么答案就是树链的并. 树链的并的求法就是把所有点按照$dfs$序排序然后相加再减去相邻之间的$lca$. 故此我们按照$dfs$序维护一个平衡树. 每次往里插入节点即可. 实时用$lca$更新答案,复杂度$O(nlogn)$. Code: #include <iostream> #include <cstdio> #include <cstring&g

蓝桥杯 历届试题 大臣的旅费 DFS两次

历届试题 大臣的旅费 时间限制:1.0s   内存限制:256.0MB 问题描述 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达.同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的. J是T国重要大臣,他巡查于各大城市之间,体察民情.所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情.他有一个钱袋,用于