具体可以见漆子超的论文

  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Accepted
  6.     Time: ms
  7.     Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. var
  12.     n, m                            :longint;
  13.     pre, other, len                 :array[..] of longint;
  14.     last                            :array[..] of longint;
  15.     l, top                          :longint;
  16.     size, stack, yy, ll             :array[..] of longint;
  17.     ff                              :array[..] of boolean;
  18.     root                            :longint;
  19.     b                               :array[..] of longint;
  20.     old                             :longint;
  21.     ans                             :longint;
  22.      
  23. procedure connect(x,y,z:longint);
  24. begin
  25.     inc(l);
  26.     pre[l]:=last[x];
  27.     last[x]:=l;
  28.     other[l]:=y;
  29.     len[l]:=z;
  30. end;
  31.  
  32.  
  33. procedure dfs_size(x,fa:longint);
  34. var
  35.     q, p                            :longint;
  36. begin
  37.     size[x]:=;
  38.     inc(top);
  39.     stack[top]:=x;
  40.     q:=last[x];
  41.     while q<> do
  42.     begin
  43.         p:=other[q];
  44.         if (ff[q]) or (p=fa) then
  45.         begin
  46.             q:=pre[q];
  47.             continue;
  48.         end;
  49.         dfs_size(p,x);
  50.         inc(size[x],size[p]);
  51.         q:=pre[q];
  52.     end;
  53.     yy[x]:=fa;
  54. end;
  55.  
  56. procedure getroot(u:longint);
  57. var
  58.     ms, s, x, p, q                  :longint;
  59.     i                               :longint;
  60. begin
  61.     top:=;
  62.     dfs_size(u,);
  63.     ms:=maxlongint;
  64.     for i:= to top do
  65.     begin
  66.         x:=stack[i];
  67.         s:=size[u]-size[x];
  68.         q:=last[x];
  69.         while q<> do
  70.         begin
  71.             p:=other[q];
  72.             if (ff[q]) or (p=yy[x]) then
  73.             begin
  74.                 q:=pre[q];
  75.                 continue;
  76.             end;
  77.             if size[p]>s then s:=size[p];
  78.             q:=pre[q];
  79.         end;
  80.         if s<ms then
  81.         begin
  82.             ms:=s;
  83.             root:=x;
  84.         end;
  85.     end;
  86. end;
  87.  
  88. procedure dfs_value(x,fa,lz,dep:longint);
  89. var
  90.     q, p                            :longint;
  91. begin
  92.     if lz>m then exit;
  93.     if dep>=ans then exit;
  94.     if b[m-lz]>= then
  95.         if b[m-lz]+dep<ans then ans:=b[m-lz]+dep;
  96.     if (b[lz]<) or (dep<b[lz]) then
  97.     begin
  98.         inc(top);
  99.         stack[top]:=lz;
  100.         ll[top]:=dep;
  101.     end;
  102.     q:=last[x];
  103.     while q<> do
  104.     begin
  105.         p:=other[q];
  106.         if (p=fa) or (ff[q]) then
  107.         begin
  108.             q:=pre[q];
  109.             continue;
  110.         end;
  111.         dfs_value(p,x,lz+len[q],dep+);
  112.         q:=pre[q];
  113.     end;
  114. end;
  115.  
  116. procedure solve(u:longint);
  117. var
  118.     i, q, p                         :longint;
  119.  
  120. begin
  121.     getroot(u);
  122.     if top= then exit;
  123.     top:=;
  124.     q:=last[root];
  125.     while q<> do
  126.     begin
  127.         p:=other[q];
  128.         if ff[q] then
  129.         begin
  130.             q:=pre[q];
  131.             continue;
  132.         end;
  133.         old:=top+;
  134.         dfs_value(p,root,len[q],);
  135.         for i:=old to top do
  136.             if (b[stack[i]]<) or (b[stack[i]]>ll[i]) then b[stack[i]]:=ll[i];
  137.         q:=pre[q];
  138.     end;
  139.      
  140.     for i:= to top do b[stack[i]]:=-;
  141.     q:=last[root];
  142.     while q<> do
  143.     begin
  144.         p:=other[q];
  145.         if ff[q] then
  146.         begin
  147.             q:=pre[q];
  148.             continue;
  149.         end;
  150.         ff[q]:=true;
  151.         ff[q xor ]:=true;
  152.         solve(p);
  153.         q:=pre[q];
  154.     end;
  155.          
  156. end;
  157.  
  158.      
  159. procedure main;
  160. var
  161.     i                               :longint;
  162.     x, y, z                         :longint;
  163.      
  164. begin
  165.     read(n,m);
  166.     l:=;
  167.     fillchar(b,sizeof(b),$ff);
  168.     b[]:=;   
  169.     for i:= to n- do
  170.     begin
  171.         read(x,y,z);
  172.         inc(x); inc(y);
  173.         connect(x,y,z);
  174.         connect(y,x,z);
  175.     end;
  176.     ans:=maxlongint;
  177.     solve();
  178.     if ans> then writeln(-) else writeln(ans);
  179. end;
  180.  
  181. begin
  182.     main;
  183. end.

bzoj 2599 数分治 点剖分的更多相关文章

  1. bzoj 2599(点分治)

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 3642  Solved: 1081[Submit][Statu ...

  2. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  3. BZOJ 2599: [IOI2011]Race( 点分治 )

    数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...

  4. bzoj 2599 [IOI2011]Race (点分治)

    [题意] 问树中长为k的路径中包含边数最少的路径所包含的边数. [思路] 统计经过根的路径.假设当前枚举到根的第S个子树,若x属于S子树,则有: ans<-dep[x]+min{ dep[y] ...

  5. BZOJ 2599 [IOI2011]Race【Tree,点分治】

    给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是 ...

  6. 【BZOJ 2599】【IOI 2011】Race 点分治

    裸的点分治,然而我因为循环赋值$s$时把$i <= k$写成$i <= n$了,WA了好长时间 #include<cstdio> #include<cstring> ...

  7. BZOJ 2599 Race(树分治)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2599 题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 题意:每次 ...

  8. bzoj 2599: [IOI2011]Race (点分治 本地过了就是过了.jpg)

    题面:(复制别人的...) Description 给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的 ...

  9. bzoj 2599: [IOI2011]Race【点分治】

    点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m-dis[p]]+de[p]) 这里注意更新和初 ...

随机推荐

  1. [Java]_函数传参的疑惑与思考

    问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. void dfs(TreeNode node , int sum , ArrayList& ...

  2. 分析MapReduce执行过程

    分析MapReduce执行过程 MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出. Reducer任务会接收Mapper任务输 ...

  3. mysql事件调度器定时删除binlog

    MySQL5.1.6起Mysql增加了事件调度器(Event Scheduler),可以用做定时执行某些特定任务,来取代原先只能由Linux操作系统的计划任务来执行的工作MySQL的事件调度器可以精确 ...

  4. Delphi For Android 开发笔记 2 NEXTGEN下的字符串类型

    delphi开发速度迅捷至少有30%(猜的,呵呵)的原因是因为其字符串(string.WideString.PChar.PAnsiChar等)处理能力. 而从delphi XE4开始,在system等 ...

  5. java基础笔记

    1. 成员变量会自动的进行初始化,但是局部变量不会: 2. equals传引用值,==传地址值:当一个对象是引用类型时,就必须使用equals进行比较. 3. 继承:实现代码的复用,继承关系以一种验证 ...

  6. openstack做镜像

    virt-install --virt-type kvm --name windows2008 --ram 1024 --cdrom /opt/windows-2008-x86_64.iso --di ...

  7. python 校招信息爬虫程序

    发现一个爬虫程序,正在学习中: https://github.com/lizherui/spider_python

  8. Unix 编程

    1. Users and Groups 真实用户ID和真实组ID 真实用户ID和组ID表示运行进程的真实用户 ID 和 组ID. 有效用户ID和有效组IDp 有效 ID 是进程进行相关操作(比如系统调 ...

  9. 常用的PC/SC接口函数

    PC/SC规范是一个基于WINDOWS平台的一个标准用户接口(API),提供了一个从个人电脑(Personal Computer)到智能卡(SmartCard)的整合环境,PC/SC规范建立在工业标准 ...

  10. android开发系列之gradle认识

    后面的系列博客,我将会写一写自己这段时间对于android的学习.认识.体会,希望能够与大家分享. 相信大家从ADT开发切换到android studio最大.最直观的变化就是gradle,因为在an ...