zoukankan      html  css  js  c++  java
  • bzoj1912

    由于k只有2,所以我们分类讨论
    显然当k=1时,我们只要连一条最长的路径即可就是树的直径L
    少走了L-1条边
    如果k=2时,我们再次连边成环后
    如果成环路径与上一次的最长路径没有相同的边,那少走的边数是路径长l-1
    如果有相同的边,那么相同的边一共还是会走两次,少走的边数是l-1-2*same
    因此我们只要把第一次找的的最长路径上的边标记为-1,再做一次树形dp即可

     1 type node=record
     2        po,len,next:longint;
     3      end;
     4 
     5 var w:array[0..200010] of node;
     6     f,p1,p2,p:array[0..100010] of longint;
     7     v:array[0..100010] of boolean;
     8     i,ans,loc,maxx,t,n,k,x,y:longint;
     9 
    10 function max(a,b:longint):longint;
    11   begin
    12     if a>b then exit(a) else exit(b);
    13   end;
    14 
    15 procedure add(x,y:longint);
    16   begin
    17     inc(t);
    18     w[t].po:=y;
    19     w[t].len:=1;
    20     w[t].next:=p[x];
    21     p[x]:=t;
    22   end;
    23 
    24 procedure dfs(x:longint);
    25   var i,y,s1,s2:longint;
    26   begin
    27     i:=p[x];
    28     v[x]:=true;
    29     s1:=0;
    30     s2:=0;
    31     while i<>-1 do
    32     begin
    33       y:=w[i].po;
    34       if not v[y] then
    35       begin
    36         dfs(y);
    37         if f[y]+w[i].len>s1 then
    38         begin
    39           s2:=s1;
    40           p2[x]:=p1[x];
    41           s1:=f[y]+w[i].len;
    42           p1[x]:=i;
    43         end
    44         else if (s2<f[y]+w[i].len) then
    45         begin
    46           s2:=f[y]+w[i].len;
    47           p2[x]:=i;
    48         end;
    49       end;
    50       i:=w[i].next;
    51     end;
    52  //   writeln(x,' ',s1,' ',s2);
    53     f[x]:=s1;
    54     if maxx<s1+s2 then
    55     begin
    56       maxx:=s1+s2;
    57       loc:=x;
    58     end;
    59   end;
    60 
    61 begin
    62   t:=-1;
    63   fillchar(p,sizeof(p),255);
    64   fillchar(p1,sizeof(p1),255);
    65   fillchar(p2,sizeof(p2),255);
    66   readln(n,k);
    67   for i:=1 to n-1 do
    68   begin
    69     readln(x,y);
    70     add(x,y);
    71     add(y,x);
    72   end;
    73   dfs(1);
    74   ans:=2*(n-1)-maxx+1;
    75   if k=2 then
    76   begin
    77     maxx:=0;
    78     w[p1[loc]].len:=-1;
    79     w[p2[loc]].len:=-1;
    80     x:=w[p1[loc]].po;
    81     while p1[x]<>-1 do
    82     begin
    83       w[p1[x]].len:=-1;
    84       x:=w[p1[x]].po;
    85     end;
    86     x:=w[p2[loc]].po;
    87     while p1[x]<>-1 do
    88     begin
    89       w[p1[x]].len:=-1;
    90       x:=w[p1[x]].po;
    91     end;
    92     fillchar(v,sizeof(v),false);
    93     fillchar(f,sizeof(f),0);
    94     dfs(1);
    95     ans:=ans-maxx+1;
    96   end;
    97   writeln(ans);
    98 end.
    View Code
  • 相关阅读:
    SQlite数据库
    关于如何获取剪切板的多个图片处理
    aes 和 Md5 分析
    SIP消息
    getItemAt
    C++ map的方法
    C++ 解析Json
    CentOS 6.3安装配置LAMP服务器(Apache+PHP5+MySQL)
    阿里云服务器CentOS 5.7(64位)安装配置LAMP服务器(Apache+PHP5+MySQL)
    Apache虚拟主机(vhost)配置教程
  • 原文地址:https://www.cnblogs.com/phile/p/4473036.html
Copyright © 2011-2022 走看看