蓝桥杯 大臣的旅费_树的最长度_两次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;    //找到最远路 
        }
    }

    //树的最长路求法:两次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;

参考了这篇博客
http://blog.csdn.net/chao1983210400/article/details/26447001

如果你想使用Python编写一个程序来计算大臣旅费,你需要明确旅费的计算规则和参数。例如,你需要知道旅行的目的地、交通方式、住宿费用等信息。 一种简单的示例是,假设大臣旅费计算规则是根据目的地的距离和交通方式来计算。你可以使用第三方库如`googlemaps`来获取两地之间的距离,并根据交通方式确定旅行费用。以下是一个使用Google Maps API计算两地之间距离的示例代码: ```python import googlemaps def calculate_travel_expense(origin, destination, mode): # 设置你的Google Maps API密钥 gmaps = googlemaps.Client(key='YOUR_API_KEY') # 获取两地之间的距离(返回结果以公里为单位) result = gmaps.distance_matrix(origin, destination, mode=mode, units='metric') # 提取距离值 distance = result['rows'][0]['elements'][0]['distance']['value'] / 1000 # 转换为公里 # 根据交通方式确定旅费 if mode == 'driving': expense = distance * 0.5 # 假设每公里花费0.5元 elif mode == 'transit': expense = distance * 0.3 # 假设每公里花费0.3元 else: expense = distance * 0.2 # 假设每公里花费0.2元 return expense # 示例:计算从北京到上海的旅费(以驾车方式) origin = "北京" destination = "上海" mode = "driving" expense = calculate_travel_expense(origin, destination, mode) print("旅费:", expense, "元") ``` 请注意,上述示例仅为演示目的,并没有真实的旅费数据。你可以根据实际情况和需求进行相应的修改和扩展。此外,你需要提供有效的Google Maps API密钥才能正常运行此代码。 希望这个示例能帮助到你开始编写计算大臣旅费的Python程序。如果你有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值