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.

 

 

 

posted @ 2018-08-15 21:55  猪都哭了  阅读(208)  评论(0编辑  收藏  举报