[Nowcoder] Agamemnon‘s Odyssey | 树的直径

简介: 题意:有一棵树,n − 1 n-1n−1条边中,两两之间都有一个边权,可以从任意一个点出发,最多经过每一条边k次,只有第一次经过的时候才会算上边权的贡献,问最大的贡献是多少?其实这道题是非常简单的,是比较模板的题首先我们考虑,当k ⩾ 2 k \geqslant 2k⩾2的情况,我们可以将整棵树遍历过一遍,所以说最大贡献便是所有的边权和当k = = 1 k == 1k==1的情况下,其实就是树的直径,树的直径上,满足贡献最大

链接

Agamemnon, the great king of Mycenae, was assembling his troops in Aulis to sail to the shores of Troy, when he had a vision of goddess Artemis. In this vision, Agamemnon found out that he had accidentally slain a deer that was sacred to Artemis, and now the goddess swore to make Agamemnon suffer on his voyage to Troy.

Along his route to Troy, Agamemnon was planning to stop at the islands of Crete to gather resources for his formidable army. If Artemis were to find out about the sea routes Agamemnon took, she would use her powers to stop the wind along those routes, leaving Agamemnon and his crew stranded. As the trusty advisor of Agamemnon, you now have to help him devise a path between the islands of Crete that provides the army the maximum amount of resources, without letting Artemis discover the routes you take.


4750c1dda28e4c589a911c95bf5f33c1.png


The N islands of Crete are connected to each other via N−1 sea routes. Along each route, Agamemnon can acquire a certain amount of resources. However, if a route is used more than kk times, Artemis will detect the presence of Agamemnon along that route and stop the wind along that route. So, a feasible plan cannot use any route more than k times.

Given that Agamemnon can start and end at any of the islands of Crete, come up with a feasible plan that maximises Agamemnon’s resource earnings. Note that Agamemnon can only collect resources along a sea route during its first use. He does not earn extra resources from a route on reusing it.


08e75bc495e54272980e04d55fa2c6eb.png


输入


5 1
1 2 3
2 3 1
1 4 5
1 5 9


输出


14


说明


There are 5 islands in Crete, connected to each other via 4 routes, as shown in the figure: the first connecting island 1 and 2 and allowing Agamemnon to acquire 3 units of resources and so on. In this archipelago, the best plan forAgamemnon is to start at island 4, visit island 1 (acquiring 5 units of resources along the 4→1 route), and then endhis path at island 5 (acquiring another 9 units of resources along the 1→5 route), having earned a total of 14 units of resources.


示例2


输入


5 2
1 2 3
2 3 1
1 4 5
1 5 9


输出


18


题意:


有一棵树,n − 1 n-1n−1条边中,两两之间都有一个边权,可以从任意一个点出发,最多经过每一条边k次,只有第一次经过的时候才会算上边权的贡献,问最大的贡献是多少?


其实这道题是非常简单的,是比较模板的题


首先我们考虑,当k ⩾ 2 k \geqslant 2k⩾2的情况,我们可以将整棵树遍历过一遍,所以说最大贡献便是所有的边权和

当k = = 1 k == 1k==1的情况下,其实就是树的直径,树的直径上,满足贡献最大


#include <math.h>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 7;
int n,k;
struct node{
    int u,v,nex,w;
}e[maxn << 1];
int cnt,head[maxn],u,v,w;
bool vis[maxn];
ll dis[maxn];
void init(){
    cnt = 0;
    for(int i=1;i<=n;i++) head[i] = -1;
}
void add(int u,int v,int w){
    e[cnt].u = u;
    e[cnt].v = v;
    e[cnt].w = w;
    e[cnt].nex = head[u];
    head[u] = cnt ++;
}
void dfs(int u){
    vis[u] = 1;
    for(int i=head[u];~i;i=e[i].nex){
        int to = e[i].v;
        if(vis[to]) continue;
        dis[to] = dis[u] + e[i].w;
        dfs(to);
    }
}
int main(){
    ll sum = 0;
    scanf("%d %d",&n,&k);
    init();
    for(int i=1;i<n;i++){
        scanf("%d%d%d",&u,&v,&w);
        sum += w;
        add(u,v,w);
        add(v,u,w);
    }
    if(k >= 2) {
        cout << sum <<endl;
        return 0;
    }
    memset(vis,0,sizeof vis);
    memset(dis,0,sizeof dis);
    dfs(1);
    ll mx = 0,p = 0;
    for(int i=1;i<=n;i++){
        if(dis[i] > mx){
            mx = dis[i];
            p = i;
        }
    }
    /// p
    memset(vis,0,sizeof vis);
    memset(dis,0,sizeof dis);
    dfs(p);
    mx = 0;
    for(int i=1;i<=n;i++){
        mx = max(mx,dis[i]);
    }
    cout << mx << endl;
    return 0;
}


文章知识点与官方知识档案匹配,可进一步学习相关知识

算法技能树leetcode-树95-不同的二叉搜索树 II8048 人正在系统学习中


目录
相关文章
|
6月前
leetcode-543:二叉树的直径
leetcode-543:二叉树的直径
34 0
|
6月前
|
NoSQL 容器 消息中间件
树的直径、最近公共祖先、树的变形
树的直径、最近公共祖先、树的变形
|
6月前
|
人工智能 BI
【每日一题Day267】LC834树中距离之和 | 换根dp
【每日一题Day267】LC834树中距离之和 | 换根dp
43 0
【LeetCode】1022. 从根到叶的二进制数之和、563. 二叉树的坡度
1022. 从根到叶的二进制数之和 1022. 从根到叶的二进制数之和
44 0
|
存储
【Leetcode -563.二叉树的坡度 - Nowcoder -KY11.二叉树遍历】
【Leetcode -563.二叉树的坡度 - Nowcoder -KY11.二叉树遍历】
44 0
|
6月前
|
人工智能 算法 BI
【深度优先搜索 图论 树】2872. 可以被 K 整除连通块的最大数目
【深度优先搜索 图论 树】2872. 可以被 K 整除连通块的最大数目
【Leetcode -404.左子叶之和 -543.二叉树的直径】
【Leetcode -404.左子叶之和 -543.二叉树的直径】
54 0
leetcode 543:二叉树的直径
leetcode 543:二叉树的直径
52 0
|
算法
图解LeetCode——543. 二叉树的直径
图解LeetCode——543. 二叉树的直径
10830 1
Leecode543. 二叉树的直径
Leecode543. 二叉树的直径
35 0