专栏文章

题解:P14076 [GESP202509 六级] 货物运输

P14076题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minrec16
此快照首次捕获于
2025/12/02 07:07
3 个月前
此快照最后确认于
2025/12/02 07:07
3 个月前
查看原文
通过题意,
nn 座城市由 n1n-1 条双向道路连接。
我们可以知道,这是一棵树,CCF不会给我们弄一个非连通图。如果每次运送完货物都需要回首都的话,那么最后的路程一定是所有路径的长度和的两倍。但是题目说了,最后不用返回首都,那么让我们来观察一下,最短路程是什么。
CPP
自造数据

    1
  1/ \2
  2   3
7/ \4  \3
4   5   6
画的有点丑,请谅解。
上面的图上每条边左边或右边的数字代表边的长度,这个图上离首都最远的叶子节点是节点 44,他与首都的距离是 1+7=81+7=8,所以我们要用所以边的长度和两倍减去图上离首都最远的叶子节点与首都的距离,才能得到最短路程,对于上面的图,答案是 99

代码:

CPP
#include <iostream>
#include <vector>
using namespace std;
vector<int> a[100001];
vector<long long> b[100001];
long long r[100001],ans;
bool vis[100001];
void f(int x)
{
    if(a[x].empty()) return;
    for(int i=0;i<=a[x].size()-1;++i)
    {
        if(vis[a[x][i]]==1) continue;
        vis[a[x][i]]=1;
        r[a[x][i]]=r[x]+b[x][i];
        ans=max(ans,r[a[x][i]]);
        f(a[x][i]);
    }
}
int main()
{
    int n,u,v;
    long long l,cnt=0;
    cin>>n;
    for(int i=1;i<=n-1;++i)
    {
        cin>>u>>v>>l;
        a[u].push_back(v);
        a[v].push_back(u);
        b[u].push_back(l);
        b[v].push_back(l);
        cnt+=l;
    }
    vis[1]=1;
    f(1);
    cout<<cnt+cnt-ans;
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...