zoukankan      html  css  js  c++  java
  • Poj_1741_Tree

    Description

    给一个有n个顶点的树,每个边都有一个长度(正整数小于1001)。
    定义dist(u,v)=节点u和v之间的最小距离。
    给出一个整数k,当且仅当dist(u,v)不超过k时,每个对(u,v)的顶点都被称为有效。
    编写一个程序,计算对给定树有效的对数。

     

    Input

    输入包含几个测试用例。 每个测试用例的第一行包含两个整数n,k。 (n <= 10000)以下n-1行各包含三个整数u,v,l,这意味着在节点u和v之间存在长度为l的边。
    最后一个测试用例后跟两个零。

     

    Output

    对于每个测试用例,在单行上输出答案。

     

    Solution

    裸的点分。

    细节:注意不能同一个子树的对数不能算。

     
    代码
      1 type
      2   arr=record
      3     y,w,next:longint;
      4   end;
      5 var
      6   n,s,e,nm,dt,ans,min:longint;
      7   a:array [0..200001] of arr;
      8   ls,size,v,d,deep:array [0..100001] of longint;
      9 procedure add(x,y,z:longint);
     10 begin
     11   inc(nm);
     12   a[nm].y:=y; a[nm].w:=z;
     13   a[nm].next:=ls[x]; ls[x]:=nm;
     14 end;
     15 
     16 procedure init;
     17 var
     18   i,x,y,z:longint;
     19 begin
     20   nm:=0;
     21   for i:=1 to n-1 do
     22     begin
     23       readln(x,y,z);
     24       add(x,y,z); add(y,x,z);
     25     end;
     26   ans:=0;
     27 end;
     28 
     29 procedure dfs1(x,last:longint);
     30 var
     31   i:longint;
     32 begin
     33   size[x]:=1; i:=ls[x];
     34   while i<>0 do
     35     begin
     36       if (v[a[i].y]=1) or (a[i].y=last) then
     37         begin
     38           i:=a[i].next;
     39           continue;
     40         end;
     41       dfs1(a[i].y,x);
     42       size[x]:=size[x]+size[a[i].y];
     43       i:=a[i].next;
     44     end;
     45 end;
     46 
     47 function dfs2(x,last,tot:longint):longint;
     48 var
     49   i:longint;
     50 begin
     51   i:=ls[x];
     52   while i<>0 do
     53     begin
     54       if (v[a[i].y]=1) or (a[i].y=last) or (size[a[i].y]*2<tot) then
     55         begin
     56           i:=a[i].next;
     57           continue;
     58         end;
     59       exit(dfs2(a[i].y,x,tot));
     60       i:=a[i].next;
     61     end;
     62   exit(x);
     63 end;
     64 
     65 procedure gd(x,last:longint);
     66 var
     67   i:longint;
     68 begin
     69   inc(dt); d[dt]:=deep[x];
     70   i:=ls[x];
     71   while i<>0 do
     72     begin
     73       if (a[i].y=last) or (v[a[i].y]=1) then
     74         begin
     75           i:=a[i].next;
     76           continue;
     77         end;
     78       deep[a[i].y]:=deep[x]+a[i].w;
     79       gd(a[i].y,x);
     80       i:=a[i].next;
     81     end;
     82 end;
     83 
     84 procedure qsort(l,r:longint);
     85 var
     86   mid,i,j,k:longint;
     87 begin
     88   if l>r then exit;
     89   i:=l; j:=r;
     90   mid:=d[(l+r) div 2];
     91   repeat
     92     while d[i]<mid do inc(i);
     93     while d[j]>mid do dec(j);
     94     if i<=j then
     95       begin
     96         k:=d[i]; d[i]:=d[j]; d[j]:=k;
     97         inc(i); dec(j);
     98       end;
     99   until i>j;
    100   qsort(i,r);
    101   qsort(l,j);
    102 end;
    103 
    104 function js(x,cz:longint):longint;
    105 var
    106   i,j,num:longint;
    107 begin
    108   num:=0;
    109   dt:=0; deep[x]:=cz;
    110   gd(x,0);
    111   qsort(1,dt);
    112   j:=dt; i:=1;
    113   while i<j do
    114     if (d[i]+d[j]<=e) then
    115       begin
    116         num:=num+j-i;
    117         inc(i);
    118       end else dec(j);
    119   exit(num);
    120 end;
    121 
    122 procedure main(x:longint);
    123 var
    124   i:longint;
    125 begin
    126   ans:=ans+js(x,0);
    127   v[x]:=1;
    128   i:=ls[x];
    129   while i<>0 do
    130 
    131     begin
    132       if v[a[i].y]=1 then
    133         begin
    134           i:=a[i].next;
    135           continue;
    136         end;
    137       ans:=ans-js(a[i].y,a[i].w);
    138       dfs1(a[i].y,0);
    139       main(dfs2(a[i].y,0,size[a[i].y]));
    140       i:=a[i].next;
    141     end;
    142 end;
    143 
    144 begin
    145   readln(n,e);
    146   while (n<>0) and (e<>0) do
    147     begin
    148       fillchar(ls,sizeof(ls),0);
    149       fillchar(v,sizeof(v),0);
    150       init;
    151       dfs1(1,0);
    152       main(dfs2(1,0,n));
    153       write(ans);
    154       readln(n,e);
    155     end;
    156 end.

     

  • 相关阅读:
    新浪微盘又是一个给力的产品啊,
    InfoQ: 百度数据库架构演变与设计
    列式数据库——Sybase IQ
    MapR初体验 淘宝共享数据平台 tbdata.org
    IBM正式发布新一代zEnterprise大型机(组图) 大型机,IBM,BladeCenter,美国,纽约 TechWeb News
    1TB is equal to the number of how many GB? 1PB equal to is equal to the number of TB? 1EB PB? | PCfault.com
    Cassandra vs HBase | WhyNosql
    The Hadoop Community Effect
    雅虎剥离开源软件平台 Hadoop ,与风投新建 Hortonworks 公司 品味雅虎
    RowOriented Database 、ColumnOriented Database 、KeyValue Store Database 、DocumentOriented Database
  • 原文地址:https://www.cnblogs.com/zyx-crying/p/9484224.html
Copyright © 2011-2022 走看看