zoukankan      html  css  js  c++  java
  • Luogu P3629 [APIO2010]巡逻【题解】树的直径

    Luogu P3629 [APIO2010]巡逻

    树的直径


    题面链接
    看题就知道应该是连树的直径,也就是最长链
    (ans=2(n-1)-l1+1)
    但是(kle2)
    当他是(2)的时候怎么处理???
    只好再跑一遍求树的直径
    我们先把之前求出的(l1)的所有边变为(-1)
    之后再求
    (ans=2(n-1)-(l1-1)-(l2-1))
    要是有重叠也不用特殊处理
    因为(l1)取反了之后再减去(l2)就相当于加回来了,还是两次
    所有这一个公式就解决了


    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100010;
    int fs,n,jk,head[maxn],tot=1,v[maxn],d[maxn],fa[maxn];
    struct node{
        int nxt,to,dis;
        #define nxt(x) e[x].nxt
        #define to(x) e[x].to
        #define dis(x) e[x].dis
    }e[maxn<<1];
    inline void add(int from,int to){
        to(++tot)=to;dis(tot)=1;nxt(tot)=head[from];head[from]=tot;
    }
    void dfs(int x){
        v[x]=1;
        for(int i=head[x];i;i=nxt(i)){
            if(v[to(i)]) continue;
            d[to(i)]=d[x]+dis(i);
            fs=(d[to(i)]>=d[fs]) ? to(i) : fs;
            fa[to(i)]=i;
            dfs(to(i));
        }
        v[x]=0;
    }
    void dp(int x){
        v[x]=1;
        for(int i=head[x];i;i=nxt(i)){
            if(v[to(i)]) continue;
            dp(to(i));
            fs=max(fs,d[x]+d[to(i)]+dis(i));
            d[x]=max(d[x],d[to(i)]+dis(i));
        }
    }
    int main()
    {
        scanf("%d%d",&n,&jk);
        for(int x,y,i=1;i<n;i++){
            scanf("%d%d",&x,&y);add(x,y);add(y,x);
        }
        fs=1;
        dfs(1);
        d[fs]=fa[fs]=0;
        int fs1=fs;
        dfs(fs1);
        int ans=((n-1)<<1)-d[fs]+1;
        if(jk==2){
            while(fa[fs]){
                dis(fa[fs])=-1;dis(fa[fs]^1)=-1;
                fs=to(fa[fs]^1);
            }
            fs=0;memset(d,0,sizeof(d));
            dp(fs1);
            ans-=fs-1;
        }
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    ‘Host’ is not allowed to connect to this mysql server
    centos7安装mysql
    further configuration avilable 不见了
    Dynamic Web Module 3.0 requires Java 1.6 or newer
    hadoop启动 datanode的live node为0
    ssh远程访问失败 Centos7
    Linux 下的各种环境安装
    Centos7 安装 python2.7
    安装scala
    Centos7 安装 jdk 1.8
  • 原文地址:https://www.cnblogs.com/ChrisKKK/p/11605851.html
Copyright © 2011-2022 走看看