题目大意:给一棵树,每条边有边权。求一条简单路径,权值和等于$K$,且边的数量最小。

题解:点分治,考虑到这是最小值,不满足可减性,于是点分中的更新答案的地方计算重复的部分要做更改,就用一个数组记录前面的答案。更新答案的时候只从已经访问过的部分来转移。

卡点:一个地方没有$return$,导致$RE$

C++ Code:

#include <cstdio>
#define maxn 200010
#define maxk 1000010
const int inf = 0x3f3f3f3f;
inline int max(int a, int b) {return a > b ? a : b;}
inline int min(int a, int b) {return a < b ? a : b;} int head[maxn], cnt;
struct Edge {
int to, nxt, w;
} e[maxn << 1];
inline void add(int a, int b, int c) {
e[++cnt] = (Edge) {b, head[a], c}; head[a] = cnt;
e[++cnt] = (Edge) {a, head[b], c}; head[b] = cnt;
} bool vis[maxn];
namespace Center_of_Gravity {
int sz[maxn], __nodenum;
int root, MIN;
#define n __nodenum
void __getroot(int u, int fa) {
sz[u] = 1;
int MAX = 0;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v != fa && !vis[v]) {
__getroot(v, u);
sz[u] += sz[v];
MAX = max(MAX, sz[v]);
}
}
MAX = max(MAX, n - sz[u]);
if (MAX < MIN) MIN = MAX, root = u;
}
int getroot(int u, int nodenum = 0) {
n = nodenum ? nodenum : sz[u];
MIN = inf;
__getroot(u, 0);
return root;
}
#undef n
}
using Center_of_Gravity::getroot; int n, k, ans = inf;
int mindep[maxk], W[maxn], dep[maxn], tot;
void getlist(int u, int fa, int val, int __dep) {
if (val <= k) ans = min(ans, __dep + mindep[k - val]);
else return ;
W[++tot] = val, dep[tot] = __dep;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v != fa && !vis[v]) getlist(v, u, val + e[i].w, __dep + 1);
}
}
inline void init() {
W[tot = 1] = 0;
dep[tot] = 1;
mindep[0] = 0;
}
void solve(int u) {
vis[u] = true;
init();
for (int i = head[u], now = 2; i; i = e[i].nxt) {
int v = e[i].to;
if (!vis[v]) {
getlist(v, u, e[i].w, 1);
while (now <= tot) {
mindep[W[now]] = min(mindep[W[now]], dep[now]);
now++;
}
}
}
for (int i = 1; i <= tot; i++) mindep[W[i]] = inf;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (!vis[v]) {
solve(getroot(v));
}
}
} int main() {
scanf("%d%d", &n, &k);
for (int i = 1, a, b, c; i < n; i++) {
scanf("%d%d%d", &a, &b, &c); a++, b++;
add(a, b, c);
}
__builtin_memset(mindep, 0x3f, sizeof mindep);
solve(getroot(1, n));
if (ans != inf) printf("%d\n", ans);
else puts("-1");
return 0;
}

  

[洛谷P4149][IOI2011]Race的更多相关文章

  1. 模板—点分治B(合并子树)(洛谷P4149 [IOI2011]Race)

    洛谷P4149 [IOI2011]Race 点分治作用(目前只知道这个): 求一棵树上满足条件的节点二元组(u,v)个数,比较典型的是求dis(u,v)(dis表示距离)满足条件的(u,v)个数. 算 ...

  2. 洛谷P4149 [IOI2011]Race(点分治)

    题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK ,且边的数量最小. 输入输出格式 输入格式:   第一行:两个整数 n,kn,k . 第二至 nn 行:每行三个整数,表示一条无向边的 ...

  3. 洛谷$P4149\ [IOI2011]\ Race$ 点分治

    正解:点分治 解题报告: 传送门$QwQ$ 昂先不考虑关于那个长度的限制考虑怎么做? 就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$ 然后现在考虑加入这个长度的限制?就考虑把这 ...

  4. 洛谷 P4149 [IOI2011]Race-树分治(点分治,不容斥版)+读入挂-树上求一条路径,权值和等于 K,且边的数量最小

    P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行 ...

  5. 洛谷 4149 [IOI2011]Race——点分治

    题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之 ...

  6. 洛谷 P4149 [ IOI 2011 ] Race —— 点分治

    题目:https://www.luogu.org/problemnew/show/P4149 仍然是点分治: 不过因为是取 min ,所以不能用容斥,那么子树之间就必须分开算,记录桶时注意这个: 每次 ...

  7. P4149 [IOI2011]Race

    对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include < ...

  8. P4149 [IOI2011]Race 点分治

    思路: 点分治 提交:5次 题解: 刚开始用排序+双指针写的,但是调了一晚上,总是有两个点过不了,第二天发现原因是排序时的\(cmp\)函数写错了:如果对于路径长度相同的,我们从小往大按边数排序,当双 ...

  9. LUOGU P4149 [IOI2011]Race

    题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KKK ,且边的数量最小. 输入输出格式 输入格式: 第一行:两个整数 n,kn,kn,k . 第二至 nnn 行:每行三个整数,表示一条无 ...

随机推荐

  1. centos6 下查看SELinux状态 关闭SELinux

    转载自:https://blog.csdn.net/boomjane_testingblog/article/details/52859977 SELinux(Security-Enhanced Li ...

  2. Docker自学纪实(五) 使用Dockerfile构建php网站环境镜像

    一般呢,docker构建镜像容器的方式有两种:一种是pull dockerhub仓库里面的镜像,一种是使用Dockerfile自定义构建镜像. 很多时候,公司要求的镜像并不一定符合dockerhub仓 ...

  3. JAVA / MySql 编程——第二章 初始MySQL

    1. MySQL:        ●  MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司.            MySQL最流行的关系型数据库管理系统, ...

  4. vue学习笔记-:class

    当items.state为true时使用class='rad2state',否则为rad2(默认).

  5. 申请qq第三方登录 http://www.php20.com/forum.php?mod=viewthread&tid=29 (出处: 码农之家)

    百度  qq互联  进入网站 按图中的步骤申请第三方登录即可 先申请成为开发者 审核通过后再继续操作 提交 后列表中会出现提交的申请. 状态为审核中,审核通过会得到下图. 点查看 红线后面就是appi ...

  6. python之微信好友统计信息

    需要安装库:wxpy 代码如下: from wxpy import Bot,Tuling,embed,ensure_one bot = Bot(cache_path=True) #获取好友信息 bot ...

  7. C# 不同窗口传递参数

    form1: private void button1_Click(object sender, System.EventArgs e) { Form2 frm = new Form2(); frm. ...

  8. 关于原生JS获取class,ID等属性的一些封装

    一.传统上获取是通过document.getElementById获取元素的ID属性,通过总结与学习总结一下获取元素class以及id属性的一些封装; 1.创建构造函数,这里面不需要多解释什么:(主要 ...

  9. Kali2017 Metasploit连接postgresql数据库

    msfdb:msf数据库管理命令 1.查看msf数据库连接状态 msf > db_status [*] postgresql selected, no connection //未连接 2.ms ...

  10. 16 Django-admin管理工具

      admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...