题目链接

题目

题目描述

Rinne 最近了解了如何快速维护可支持插入边删除边的图,并且高效的回答一下奇妙的询问。

她现在拿到了一个 n 个节点 m 条边的无向连通图,每条边有一个边权 \(w_i\)

现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 S 之外度为 1 的点都不能到达 S。

定义删除一条边的代价为这条边的边权,现在 Rinne 想知道完成这个游戏的最小的代价,这样她就能轻松到达 rk1 了!作为回报,她会让你的排名上升一定的数量。

输入描述

第一行三个整数 N,M,S,意义如「题目描述」所述。

接下来 M 行,每行三个整数 u,v,w 代表点 u 到点 v 之间有一条长度为 w 的无向边。

输出描述

一个整数表示答案。

示例1

输入

4 3 1
1 2 1
1 3 1
1 4 1

输出

3

说明

需要使得点 2,3,4 不能到达点 1,显然只能删除所有的边,答案为 3

示例2

输入

4 3 1
1 2 3
2 3 1
3 4 2

输出

1

说明

需要使得点 4 不能到达点 1,显然删除边 \(2 \leftrightarrow 3\) 是最优的。

备注

\(2\le S \le N\le 10^{5} ,M = N-1\) ,保证答案在 C++ long long 范围内。

题解

知识点:树形dp。

注意到从 \(S\) 开始, \(S\) 是不需要考虑的,也就是说 把\(S\) 当作根是不需要考虑根节点是否度为 \(1\) ,因此考虑从 \(S\) 开始dp。

为了使度 \(1\) 的节点都到不了 \(S\) ,也就是以 \(S\) 为根的树的叶子节点必须没有到 \(S\) 的通路,可以考虑设 \(dp[u]\) 为以 \(u\) 为根的子树需要的最小花费。于是转移方程为:

\[\left \{
\begin{array}{l}
dp[u] = \sum \min (dp[v_i],a[v_i]) &,deg[v_i] \neq 1\\
dp[u] = \sum a[v_i] &,deg[v_i] = 1
\end{array}
\right.
\]

如果子节点不是叶子节点,则可以选择断这条连子节点的边花费 \(a[v_i]\) 或者不断开使用子节点的最小花费 \(dp[v_i]\) ;如果子节点是叶子节点,则必须断边,而因为 \(dp[v_i]\) 此时为 \(0\) (因为叶子节点为根的子树里不需要断边),不能使用通式 \(\min\) 。

注意这里判断条件不一定需要真的求出 \(deg\) 数组,其实邻接表建图时就保存了这个节点有几条边,g[v].size() == 1 即可 。当然,也可以推断一下,如果不是叶子节点则 \(dp[v_i]\) 一定不为 \(0\) ,如果是则一定为 \(0\) ,所以也可以 \(dp[v_i]\)。

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

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

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; template<class T>
struct Graph {
int n;
struct edge {
int to, nxt;
T w;
};
vector<edge> e;
vector<int> h; explicit Graph(int _n) :n(_n), h(_n + 1, -1) {} void add(int u, int v, T w) {///加边
e.push_back(edge{ v,h[u],w });///边结束节点,边出发节点的上一条边在e中下标,边权
h[u] = e.size() - 1;///上一条边的下标
}
};
Graph<ll> g(100007);
ll dp[100007]; void dfs(int u, int fa) {
for (int i = g.h[u];~i;i = g.e[i].nxt) {
int v = g.e[i].to;
ll w = g.e[i].w;
if (v == fa) continue;
dfs(v, u);
if (dp[v]) dp[u] += min(dp[v], w);///不是叶子节点一定有到叶子节点的路径,则dp[v]一定不为0
else dp[u] += w;
}
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m, s;
cin >> n >> m >> s;
for (int i = 1;i <= m;i++) {
int u, v, w;
cin >> u >> v >> w;
g.add(u, v, w);
g.add(v, u, w);
}
dfs(s, 0);
cout << dp[s] << '\n';
return 0;
}

NC22598 Rinne Loves Edges的更多相关文章

  1. Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)

    <题目链接> 题目大意: 一个 $n$ 个节点 $m$ 条边的无向连通图,每条边有一个边权 $w_i$.现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 ...

  2. 牛客小白月赛11 Rinne Loves Edges

    题库链接:https://ac.nowcoder.com/acm/contest/370/F code: #include<bits/stdc++.h> using namespace s ...

  3. Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】

    <题目链接> 题目大意:Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图.当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. ...

  4. Nowcoder contest 370B Rinne Loves Graph 【分层图最短路】

    <题目链接> 题目大意: Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路连接起来了,且每条道路有它自己的距离.但是有一些城镇已经被派兵戒严,虽 ...

  5. 牛客小白月赛11 Rinne Loves Xor

    题目链接:https://ac.nowcoder.com/acm/contest/370/I code: #include<bits/stdc++.h> using namespace s ...

  6. 【动态规划】树形DP完全详解!

    蒟蒻大佬时隔三个月更新了!!拍手拍手 而且是更新了几篇关于DP的文章(RioTian狂喜) 现在赶紧学习和复习一下树形DP.... 树形DP基础:Here,CF上部分树形DP练习题:Here \[QA ...

  7. 牛客算法进阶——树形dp

    1. 小G有一个大树(求树的重心) 删除该点后最大连通块的节点数最小 设f[x]表示以x为根的子树大小,那么删除x之后的各子树大小为f[to]和n-f[x] 求max(max(f[to]),n-f[x ...

  8. 【ACM算法竞赛日常训练】DAY1题解与分析

    DAY1 共四题: 月月查华华的手机:https://ac.nowcoder.com/acm/problem/23053 Rinne Loves Edges:https://ac.nowcoder.c ...

  9. CF 444C DZY Loves Physics(图论结论题)

    题目链接: 传送门 DZY Loves Chemistry time limit per test1 second     memory limit per test256 megabytes Des ...

  10. hdu.5195.DZY Loves Topological Sorting(topo排序 && 贪心)

    DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 ...

随机推荐

  1. 通过 Feign 进行文件上传

    转载请注明出处: 项目为spring cloud 项目,项目中对各部分能力业务进行了拆分,将公共的服务能力放在一个模块当中,通过 Feign 的方式 进行调用,feign 调用的本质还是http内部通 ...

  2. 介绍这个库:C# Blazor中显示Markdown文件

    1 讲目的 前几天上线了一个在线Icon转换工具,为了让大家使用放心,改了点代码,在转换下载Icon图标后立即删除临时文件,并在工具下面贴上了工具的开发步骤和代码,大家看这样改是否合适,见Issue ...

  3. Oracle ORA-01861: 文字与格式字符串不匹配(日期格式导致的问题)

    1.问题 如图所示,Oracle ORA-01861: 文字与格式字符串不匹配.这里的日期格式出现问题,导致了ORA-01861错误. 2.解决方式 原因: 如果直接按照字符串方式,或者直接使用to_ ...

  4. 【TouchGFX 】使用 CubeMX 创建 TouchGFX 工程时 LCD 显示为雪花屏

    经几个晚上折腾,修改大量的LTDC时钟.时序,FMC时序等,结果还是一样,耐心与好使的工程仔细对比,发现是时钟源配置问题,真是冤,聊以此以示纪念 实质上是没有分清有源和无源晶振 无源晶振又被叫做 谐振 ...

  5. TLS 加密套件的学习与了解

    TLS 加密套件的学习与了解 加密套件 什么是加密套件? 加密套件是用于在SSL / TLS握手期间协商安全设置的算法的组合. 在ClientHello和ServerHello消息交换之后,客户端发送 ...

  6. [转帖]Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构

    https://www.cnblogs.com/liuqifeng/p/10405121.html varchar 和 nvarchar区别: varchar(n)长度为 n 个字节的可变长度且非 U ...

  7. [转帖]Java 容器化的历史坑(史坑) - 资源限制篇

    原文:https://blog.mygraphql.com/zh/posts/cloud/containerize/java-containerize/java-containerize-resour ...

  8. [转帖]Tiup 常用运维操作命令干货

    https://zhuanlan.zhihu.com/p/356031031 **导读**> 作者:杨漆> 16年关系型数据库管理,从oracle 9i .10g.11g.12c到Mysq ...

  9. [转帖]linux shell 脚本一些主要知识点整理

    文章目录 一./bin/sh 与 /bin/bash 的区别 二.vi与vim的区别 三.shell变量 四.Shell字符串 五.Shell函数 六.Shell基本运算符 1.Shell expr: ...

  10. expect 的简单学习与使用

    背景 最近工作中总有很多重复的事项. 比较繁琐,想着能够简单一点是一点的角度 准备采用expect来建华部分工作量. 其实还可以使用其他方式来处理. 但是感觉expect还是能够简单明了的. 所以暂时 ...