首页 > 其他分享 >NC24734 [USACO 2010 Mar G]Great Cow Gathering

NC24734 [USACO 2010 Mar G]Great Cow Gathering

时间:2022-09-02 00:02:35浏览次数:67  
标签:sz Great Mar NC24734 -- Gathering int dp barn

题目链接

题目

题目描述

Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place.

Each cow lives in one of N (1 <= N <= 100,000) different barns (conveniently numbered 1..N) which are connected by N-1 roads in such a way that it is possible to get from any barn to any other barn via the roads. Road i connects barns \(A_i\) and \(B_i\) (1 <= \(A_i\) <= N; 1 <= \(B_i\) <= N) and has length \(L_i\) (1 <= \(L_i\) <= 1,000). The Great Cow Gathering can be held at any one of these N barns. Moreover, barn i has \(C_i\) (0 <= \(C_i\) <= 1,000) cows living in it.

When choosing the barn in which to hold the Cow Gathering, Bessie wishes to maximize the convenience (which is to say minimize the inconvenience) of the chosen location. The inconvenience of choosing barn X for the gathering is the sum of the distances all of the cows need to travel to reach barn X (i.e., if the distance from barn i to barn X is 20, then the travel distance is \(C_i*20\)). Help Bessie choose the most convenient location for the Great Cow Gathering.

Consider a country with five barns with [various capacities] connected by various roads of varying lengths. In this set of barns, neither barn 3 nor barn 4 houses any cows.
      1     3     4     5
      @--1--@--3--@--3--@[2]
     [1]    |
            2
            |
            @[1]
            2
Bessie can hold the Gathering in any of five barns; here is the table of inconveniences calculated for each possible location:  Gather      ----- Inconvenience ------
  Location    B1  B2  B3  B4  B5   Total
     1         0   3   0   0  14    17
     2         3   0   0   0  16    19
     3         1   2   0   0  12    15
     4         4   5   0   0   6    15
     5         7   8   0   0   0    15
If Bessie holds the gathering in barn 1, then the inconveniences from each barn are:
      Barn 1     0 -- no travel time there!
      Barn 2     3 -- total travel distance is 2+1=3  x 1 cow = 3
      Barn 3     0 -- no cows there!
      Barn 4     0 -- no cows there!
      Barn 5    14 -- total travel distance is 3+3+1=7 x 2 cows = 14
So the total inconvenience is 17.
The best possible convenience is 15, achievable at by holding the
Gathering at barns 3, 4, or 5.

输入描述

  • Line 1: A single integer: N
  • Lines 2..N+1: Line i+1 contains a single integer: \(C_i\)
  • Lines N+2..2*N: Line i+N+1 contains three integers: \(A_i\), \(B_i\), and \(L_i\)

输出描述

  • Line 1: The minimum inconvenience possible

示例1

输入

5 
1 
1 
0 
0 
2 
1 3 1 
2 3 2 
3 4 3 
4 5 3 

输出

15

题解

知识点:树形dp。

题目给了一个树,树边有边权表示距离,节点有点权表示牛的数量,现在要选一个树上点,使得所有牛到这个点的距离最小。因此,这是一个二次扫描+换根dp的问题,因为是解决每个点对于整棵树的问题。

第一遍dp,先以 \(1\) 为根,得出节点 \(1\) 的答案(当然可选其他点作为根)。设 \(dp[u]\) 为从 \(u\) 开始到以 \(u\) 为根的子树中各个节点牛的总距离。转移方程为:

\[dp[u] = \sum (dp[v] + sz[v] \cdot w) \]

第二遍dp,从 \(1\) 出发,处理所有节点的答案。设 \(dp'[u]\) 为从 \(u\) 到牛的总距离,则有转移方程:

\[dp'[v] = dp'[u] + (sz[1] - 2 \cdot sz[v]) \]

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

int a[100007];
vector<pair<int, int>> g[100007];
ll sz[100007], dp[100007];

void dfs1(int u, int fa) {
    sz[u] = a[u];
    for (auto [v, w] : g[u]) {
        if (v == fa) continue;
        dfs1(v, u);
        sz[u] += sz[v];
        dp[u] += dp[v] + sz[v] * w;
    }
}

void dfs2(int u, int fa) {
    for (auto [v, w] : g[u]) {
        if (v == fa) continue;
        dp[v] = dp[u] + (sz[1] - 2 * sz[v]) * w;
        dfs2(v, u);
    }
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++) cin >> a[i];
    for (int i = 1;i < n;i++) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u].push_back({ v,w });
        g[v].push_back({ u,w });
    }
    dfs1(1, 0);
    dfs2(1, 0);
    //for (int i = 1;i <= n;i++) cout << dp[i] << ' ';
    ll ans = ~(1LL << 63);
    for (int i = 1;i <= n;i++) ans = min(ans, dp[i]);
    cout << ans << '\n';
    return 0;
}

标签:sz,Great,Mar,NC24734,--,Gathering,int,dp,barn
From: https://www.cnblogs.com/BlankYang/p/16648273.html

相关文章

  • Markdown基础语法
    1.标题n个#+空格+标题名字=n级标题使用#表示标题,#号数量对应标题级数,最多六级标题。#一级标题##二级标题###三级标题####四级标题#####五级标......
  • Markdown语法学习
    Markdown学习标题格式:#+空格+文字最多支持6级字体粗体格式:两边加**斜体格式:两边加*斜体加粗格式:两边加***划去格式:两边加~~引用努力学习java,走向人......
  • MarkDown学习day1
    MarkDown学习标题三级标题四级标题(标题:一级标题:#加空格,二级标题:##加空格。以此类推)字体helloworld(字体加粗,前端和后端加上**)helloworld(斜体,前端和后......
  • MariaDB配置日志审计
    MariaDB配置日志审计1.确认日志审计插件首先确认插件路径,执行下列SQL确认:MariaDB[(none)]>SHOWGLOBALVARIABLESLIKE'plugin_dir';+---------------+------------......
  • pytest系列——pluggy插件源码解读(一)HookspecMarker类和HookimplMarker类分析
    简介pluggy是一个非常优秀的插件系统,它是理解pytest的核心,只有理解了pluggy的原理,才能更好的理解和使用pytest,否则见到了pytest的很多应用都会感觉很难理解pluggy插件总......
  • linux下安装MariaDB
    MYSQL依赖包:yum-yinstalllibaio.so.1libgcc_s.so.1libstdc++.so.6yumupdatelibstdc++-4.4.7-4.el6.x86_64yum-yinstalllibncurses.so.5libtinfo.so.5......
  • 界面组件DevExpress MAUI & Xamarin v22.1 - 全新的项目模板
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboard eXpressApp 框架、适用于VisualStudio的CodeRush等一系列辅助工具。......
  • 使用 R Markdown 在 for 循环中生成标签集
    使用RMarkdown在for循环中生成标签集选项卡集是在MarkdownHTML文件中嵌套内容的好方法,使用for循环可以让它们在输出中自动迭代。Rmarkdown是与同事和主管分......
  • MarkDown学习
    MarkDown学习标题空格+标题名字一级标题是一个#开头,二级标题是两个#开头,依此类推,最多到六级标题。三级标题四级标题字体HelloWorld!两边加两个星号,就是加粗Hel......
  • MathProblem 76 Two bags and marble problem
    Youchooseoneoftwoidenticallookingbagsatrandom.Onebaghasthreeblackmarblesandonewhitemarble.Theotherhasthreewhitemarblesandoneblackm......