2599: [IOI2011]Race
2599: [IOI2011]Race
分析
被memset卡。。。
点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少。然后先遍历子树,更新答案,然后在遍历一边更新T,防止出现两个起点在同一棵子树中的情况。
代码
#include<cstdio>
#include<algorithm>
#include<cctype> using namespace std; const int N = ;
const int INF = 1e9; struct Edge{
int to,nxt,w;
Edge() {}
Edge(int a,int b,int c) {to = a,w = b,nxt = c;}
}e[N<<];
int head[N],siz[N],T[];
bool vis[N];
int n,k,tot,Size,Num,Root,Ans = N; inline int read() {
int x = ,f = ;char ch=getchar();
for (; !isdigit(ch); ch=getchar()) if(ch=='-')f=-;
for (; isdigit(ch); ch=getchar()) x=x*+ch-'';
return x*f;
}
void add_edge(int u,int v,int w) {
e[++tot] = Edge(v,w,head[u]);head[u] = tot;
e[++tot] = Edge(u,w,head[v]);head[v] = tot;
}
void getRoot(int u,int fa) {
siz[u] = ;
int mx = ;
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (v == fa || vis[v]) continue;
getRoot(v,u);
siz[u] += siz[v];
mx = max(siz[v],mx);
}
mx = max(Size-siz[u],mx);
if (mx < Num) Root = u,Num = mx;
}
void dfs1(int u,int fa,int L,int C) {
if (L > k) return ;
Ans = min(Ans,T[k-L]+C);
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (v == fa || vis[v]) continue;
dfs1(v,u,L+e[i].w,C+);
}
}
void dfs2(int u,int fa,int L,int C,int f) {
if (L > k) return ;
if (f) T[L] = min(T[L],C);
else T[L] = INF;
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (v == fa || vis[v]) continue;
dfs2(v,u,L+e[i].w,C+,f);
}
}
void calcc(int u) {
T[] = ;
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (vis[v]) continue;
dfs1(v,u,e[i].w,);
dfs2(v,u,e[i].w,,);
}
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (vis[v]) continue;
dfs2(v,u,e[i].w,,);
}
}
void solve(int u) {
vis[u] = true;
calcc(u);
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (vis[v]) continue;
Size = siz[v],Root = ,Num = 1e9;
getRoot(v,);
solve(Root);
}
}
int main() {
n = read(),k = read();
for (int i=; i<=k; ++i) T[i] = INF;
for (int u,v,w,i=; i<n; ++i) {
u = read(),v = read(),w = read();
add_edge(u+,v+,w);
if (w == k) {printf("-1");return ;}
}
Size = n;Num = 1e9;
getRoot(,);
solve(Root);
if (Ans == N) puts("-1");
else printf("%d",Ans);
return ;
}
2599: [IOI2011]Race的更多相关文章
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- bzoj 2599 [IOI2011]Race 点分
[IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 4768 Solved: 1393[Submit][Status][Dis ...
- bzoj 2599 [IOI2011]Race (点分治)
[题意] 问树中长为k的路径中包含边数最少的路径所包含的边数. [思路] 统计经过根的路径.假设当前枚举到根的第S个子树,若x属于S子树,则有: ans<-dep[x]+min{ dep[y] ...
- BZOJ 2599 [IOI2011]Race【Tree,点分治】
给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是 ...
- bzoj 2599: [IOI2011]Race (点分治 本地过了就是过了.jpg)
题面:(复制别人的...) Description 给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的 ...
- 【刷题】BZOJ 2599 [IOI2011]Race
Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...
- 【BZOJ】2599: [IOI2011]Race 点分治
[题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...
- BZOJ 2599: [IOI2011]Race
点分治,定权值,求另一关键字最小 不满足前缀加减性 可以按序遍历,用一数组$t[] 来维护路径为i的最小边数$ 再对于一个直系儿子对应的子树,先算距离求答案再更新$t数组,这样就不会重复$ #incl ...
- bzoj 2599: [IOI2011]Race【点分治】
点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m-dis[p]]+de[p]) 这里注意更新和初 ...
随机推荐
- mysql5.1安装图解教程
mysql5.1安装图解教程 曾经为了要搭建模拟平台,从内地网站学习到台湾网站,其中必不可少的一项就是MySQL,那时候正好普遍用5.1,所以也很习惯用MySQL5.1版本! 下面就以MySQL5.1 ...
- Azure:陪伴你们,是我最长情的告白
立即访问http://market.azure.cn
- 2009中国IT界名人
丁 磊:网易创始人 李 想:泡泡网 辛佳雨:代码中国创始人 张朝阳:搜狐创业者之一 王志东:新浪网创业者之一 陈天桥:盛大网络创始人,中国互动娱乐业第一人 周鸿 ...
- leetcode:查找
1. word ladder 题目: Given two words (start and end), and a dictionary, find the length of shortest t ...
- framework7 可以拉动右侧工具栏和点击当前item就可以出发事件的HTML结构
<li class="swipeout"> <div class="swipeout-content item-content"> &l ...
- Codeforces 758D Ability To Convert(区间DP)
题目链接:http://codeforces.com/problemset/problem/758/D 题意:一个n进制下的数k,其中k不会用字母,如果有A就用10代替了.求k这个数对应的,在10进制 ...
- 5、Oracle备份(oracle备份脚本配置)
1.1 Oracle数据库备份 1.1.1 链接Oracle介质管理库 请在数据库节点上操作. [oracle@db01/usr/openv/netbackup/bin]$ ./oracle_link ...
- Vue路由讲解
1>router-link和router-view组件 2>路由配置 a.动态路由 import Home from "@/views/Home.vue"; expor ...
- javaweb基础(35)_jdbc处理oracl大数据
一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...
- 统一项目中编码风格(Eclipse Java code format、codetemplate)
在公司内的日常开发过程中,除了需要遵守统一的编码规范之外,还需要对编写的代码做统一的格式化,Eclipse提供了格式化编码的工具,快捷键是:Ctrl+Shift+F. 为了统一项目组的代码风格,建议使 ...