zoukankan      html  css  js  c++  java
  • 5196. 【NOIP2017提高组模拟7.3】B (Standard IO)

    Description

    给出一棵树,求出最小的k,使得,且在树中存在路径P,使得k>=S且k<=E。(k为路径P的边的权值和)
     

    Input

    第一行给出N,S,E。N代表树的点数,S,E如题目描述一致。
    下面N-1行给出这棵树的相邻两个节点的边及其权值W。
     

    Output

    输出共一行一个整数,表示答案。若无解输出-1。
     

    Solution

    可以说是裸的点分。

    细节:若A为重心,B、C两个点不能在同一子树上来统计路径权值。

    代码

      1 type
      2   arr=record
      3     y,w,next:longint;
      4   end;
      5 var
      6   min:int64;
      7   n,s,e,nm,dt,xxx:longint;
      8   a:array [0..200001] of arr;
      9   ls,size,v,d,deep,vd:array [0..100001] of longint;
     10 procedure add(x,y,z:longint);
     11 begin
     12   inc(nm);
     13   a[nm].y:=y; a[nm].w:=z;
     14   a[nm].next:=ls[x]; ls[x]:=nm;
     15 end;
     16 
     17 procedure init;
     18 var
     19   i,x,y,z:longint;
     20 begin
     21   readln(n,s,e);
     22   fillchar(ls,sizeof(ls),0);
     23   fillchar(v,sizeof(v),0);
     24   nm:=0;
     25   for i:=1 to n-1 do
     26     begin
     27       readln(x,y,z);
     28       add(x,y,z); add(y,x,z);
     29     end;
     30   min:=maxlongint*2333;
     31 end;
     32 
     33 procedure dfs1(x,last:longint);
     34 var
     35   i:longint;
     36 begin
     37   size[x]:=1; i:=ls[x];
     38   while i<>0 do
     39     begin
     40       if (v[a[i].y]=1) or (a[i].y=last) then
     41         begin
     42           i:=a[i].next;
     43           continue;
     44         end;
     45       dfs1(a[i].y,x);
     46       size[x]:=size[x]+size[a[i].y];
     47       i:=a[i].next;
     48     end;
     49 end;
     50 
     51 function dfs2(x,last,tot:longint):longint;
     52 var
     53   i:longint;
     54 begin
     55   i:=ls[x];
     56   while i<>0 do
     57     begin
     58       if (v[a[i].y]=1) or (a[i].y=last) or (size[a[i].y]*2<tot) then
     59         begin
     60           i:=a[i].next;
     61           continue;
     62         end;
     63       exit(dfs2(a[i].y,x,tot));
     64       i:=a[i].next;
     65     end;
     66   exit(x);
     67 end;
     68 
     69 procedure gd(x,last,fa:longint);
     70 var
     71   i:longint;
     72 begin
     73   inc(dt);
     74   d[dt]:=deep[x];
     75   vd[dt]:=fa;
     76   i:=ls[x];
     77   while i<>0 do
     78     begin
     79       if (a[i].y=last) or (v[a[i].y]=1) then
     80         begin
     81           i:=a[i].next;
     82           continue;
     83         end;
     84       deep[a[i].y]:=deep[x]+a[i].w;
     85       if x=xxx then fa:=a[i].y;
     86       gd(a[i].y,x,fa);
     87       i:=a[i].next;
     88     end;
     89 end;
     90 
     91 procedure qsort(l,r:longint);
     92 var
     93   mid,i,j,k:longint;
     94 begin
     95   if l>r then exit;
     96   i:=l; j:=r;
     97   mid:=d[(l+r) div 2];
     98   repeat
     99     while d[i]<mid do inc(i);
    100     while d[j]>mid do dec(j);
    101     if i<=j then
    102       begin
    103         k:=d[i]; d[i]:=d[j]; d[j]:=k;
    104         k:=vd[i]; vd[i]:=vd[j]; vd[j]:=k;
    105         inc(i); dec(j);
    106       end;
    107   until i>j;
    108   qsort(i,r);
    109   qsort(l,j);
    110 end;
    111 
    112 procedure js(x,cz:longint);
    113 var
    114   i,j:longint;
    115 begin
    116   dt:=0; deep[x]:=cz;
    117   xxx:=x;
    118   gd(x,0,x);
    119   qsort(1,dt);
    120   j:=dt; i:=1;
    121   while i<j do
    122     if d[i]+d[j]<=e then
    123       begin
    124         if d[i]+d[j]>=s then
    125           begin
    126             if (d[i]+d[j]<min) and (vd[i]<>vd[j]) then
    127               min:=d[i]+d[j];
    128             if vd[i]=vd[j] then inc(i)
    129                            else dec(j);
    130           end else inc(i);
    131       end else dec(j);
    132 end;
    133 
    134 procedure main(x:longint);
    135 var
    136   i:longint;
    137 begin
    138   js(x,0);
    139   v[x]:=1; i:=ls[x];
    140   while i<>0 do
    141     begin
    142       if v[a[i].y]=1 then
    143         begin
    144           i:=a[i].next;
    145           continue;
    146         end;
    147       dfs1(a[i].y,0);
    148       main(dfs2(a[i].y,0,size[a[i].y]));
    149       i:=a[i].next;
    150     end;
    151 end;
    152 
    153 begin
    154   init;
    155   dfs1(1,0);
    156   main(dfs2(1,0,n));
    157   if min=maxlongint*2333 then min:=-1;
    158   write(min);
    159 end.
  • 相关阅读:
    PBRT笔记(3)——KD树
    PBRT笔记(2)——BVH
    PBRT笔记(1)——主循环、浮点误差
    《Ray Tracing in One Weekend》、《Ray Tracing from the Ground Up》读后感以及光线追踪学习推荐
    在Node.js中使用ffi调用dll
    Node.js c++ 扩展之HelloWorld
    在Qt中配置TBB以及简单实用
    对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充
    QtQuick大坑笔记之Http的Get与Post操作(带cookie)
    QtQuick自定义主题以及控件样式指引
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9484277.html
Copyright © 2011-2022 走看看