zoukankan      html  css  js  c++  java
  • POJ

    Description
    Give a tree with n vertices,each edge has a length(positive integer less than 1001).
    Define dist(u,v)=The min distance between node u and v.
    Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not exceed k.
    Write a program that will count how many pairs which are valid for a given tree.

    Input
    The input contains several test cases. The first line of each test case contains two integers n, k. (n<=10000) The following n-1 lines each contains three integers u,v,l, which means there is an edge between node u and v of length l.
    The last test case is followed by two zeros.

    Output
    For each test case output the answer on a single line.

    Sample Input

    5 4
    1 2 3
    1 3 1
    1 4 2
    3 5 1
    0 0

    Sample Output

    8

    题目大意:求树上距离小于k的点对个数

    裸题,树的点分治

      1 const
      2     maxn=10010;
      3 var
      4     n,k,cut,cuts,ans,num,tot:longint;
      5     next,last,w:array[0..maxn*2]of longint;
      6     first,size,a:array[0..maxn]of longint;
      7     flag:array[0..maxn]of boolean;
      8 
      9 function max(x,y:longint):longint;
     10 begin
     11     if x>y then exit(x);
     12     exit(y);
     13 end;
     14 
     15 procedure dfs1(x:longint);
     16 var
     17     i,s:longint;
     18 begin
     19     size[x]:=1;
     20     i:=first[x];
     21     flag[x]:=false;
     22     s:=0;
     23     while i<>0 do
     24       begin
     25         if flag[last[i]] then
     26         begin
     27           dfs1(last[i]);
     28           inc(size[x],size[last[i]]);
     29           s:=max(s,size[last[i]]);
     30         end;
     31         i:=next[i];
     32       end;
     33     if max(num-size[x],s)<cuts then
     34     begin
     35       cut:=x;
     36       cuts:=max(num-size[x],s);
     37     end;
     38     flag[x]:=true;
     39 end;
     40 
     41 procedure swap(var x,y:longint);
     42 var
     43     t:longint;
     44 begin
     45     t:=x;x:=y;y:=t;
     46 end;
     47 
     48 procedure sort(l,r:longint);
     49 var
     50     i,j,y:longint;
     51 begin
     52     i:=l;
     53     j:=r;
     54     y:=a[(l+r)>>1];
     55     repeat
     56       while a[i]<y do
     57         inc(i);
     58       while a[j]>y do
     59         dec(j);
     60       if i<=j then
     61       begin
     62         swap(a[i],a[j]);
     63         inc(i);
     64         dec(j);
     65       end;
     66     until i>j;
     67     if i<r then sort(i,r);
     68     if j>l then sort(l,j);
     69 end;
     70 
     71 procedure dfs2(x,d:longint);
     72 var
     73     i:longint;
     74 begin
     75     inc(a[0]);
     76     a[a[0]]:=d;
     77     flag[x]:=false;
     78     i:=first[x];
     79     while i<>0 do
     80       begin
     81         if flag[last[i]] then dfs2(last[i],d+w[i]);
     82         i:=next[i];
     83       end;
     84     flag[x]:=true;
     85 end;
     86 
     87 function calc(x,d:longint):longint;
     88 var
     89     l,r:longint;
     90 begin
     91     calc:=0;
     92     a[0]:=0;
     93     dfs2(x,d);
     94     sort(1,a[0]);
     95     l:=a[0];
     96     for r:=1 to a[0] do
     97       begin
     98         while (a[l]+a[r]>k) and (l>0) do
     99           dec(l);
    100         if l<r then inc(calc,l)
    101         else inc(calc,r-1);
    102       end;
    103 end;
    104 
    105 procedure work;
    106 var
    107     i:longint;
    108 begin
    109     inc(ans,calc(cut,0));
    110     flag[cut]:=false;
    111     i:=first[cut];
    112     while i<>0 do
    113       begin
    114         if flag[last[i]] then dec(ans,calc(last[i],w[i]));
    115         i:=next[i];
    116       end;
    117     i:=first[cut];
    118     while i<>0 do
    119       begin
    120         if flag[last[i]] then
    121         begin
    122           dfs1(last[i]);
    123           num:=last[i];
    124           cuts:=num;
    125           cut:=last[i];
    126           dfs1(last[i]);
    127           work;
    128         end;
    129         i:=next[i];
    130       end;
    131 end;
    132 
    133 procedure insert(x,y,z:longint);
    134 begin
    135     inc(tot);
    136     last[tot]:=y;
    137     next[tot]:=first[x];
    138     first[x]:=tot;
    139     w[tot]:=z;
    140 end;
    141 
    142 procedure init;
    143 var
    144     i,x,y,z:longint;
    145 begin
    146     read(n,k);
    147     if n=0 then halt;
    148     tot:=0;
    149     for i:=1 to n do
    150       begin
    151         first[i]:=0;
    152         flag[i]:=true;
    153       end;
    154     ans:=0;
    155     for i:=1 to n-1 do
    156       begin
    157         read(x,y,z);
    158         insert(x,y,z);
    159         insert(y,x,z);
    160       end;
    161     cut:=0;
    162     cuts:=n;
    163     dfs1(1);
    164     work;
    165     writeln(ans);
    166 end;
    167 
    168 begin
    169     while true do
    170       init;
    171 end.
    View Code
  • 相关阅读:
    获取其他线程的数据用 queue, 多进程Q
    self: 限制并发量asyncio
    asyncio 中给running 的loop 动态添加 Future Task
    雾里看花之 Python Asyncio
    python协程之动态添加任务
    异步IO( asyncio) 协程
    加快phpstorm、rubymine、pycharm系列IDE运行速度的方法
    scrapy 'fcntl' has no attribute 'F_GETFD
    sitemap index
    Django模板系统 运算
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3639891.html
Copyright © 2011-2022 走看看