zoukankan      html  css  js  c++  java
  • [题解]luogu_P3523(树上覆盖

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=700006;
    int n,m;
    struct node{
        int v,nxt;
    }e[maxn<<1];
    int head[maxn],cnt;
    inline void add(int u,int v){
        e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
    }
    int f[maxn],g[maxn];//x子树内距离最远未被覆盖的和最近已选的 
    int w[maxn],ans;
    void dfs(int x,int fa,int k){
        for(int i=head[x];i;i=e[i].nxt){
            int y=e[i].v;
            if(y==fa)continue;
            dfs(y,x,k);
            f[x]=max(f[x],f[y]+1);
            g[x]=min(g[x],g[y]+1);
        }
        if(w[x]&&g[x]>k)f[x]=max(f[x],0);//是关键点并且未被覆盖更新f,表示有点没有被覆盖 
        if(g[x]+f[x]<=k)f[x]=-0x3f3f3f3f;//最远未被覆盖的可以被覆盖,全部都可以覆盖 
        if(f[x]==k){
            ans++;
            g[x]=0;f[x]=-0x3f3f3f3f;//f[x]==mid必选,全部覆盖 
        }
    }
    inline bool check(int mid){
        memset(g,0x3f,sizeof(g));
        memset(f,~0x3f,sizeof(f));//初值表示没有需要覆盖的 
        ans=0;
        dfs(1,1,mid);
        if(f[1]>=0)ans++;
        return ans<=m;
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&w[i]);
        for(int i=1,u,v;i<n;i++){
            scanf("%d%d",&u,&v);
            add(u,v);add(v,u);
        }
        int l=0,r=n;
        while(l<r){
            int mid=l+r>>1;
            if(check(mid))r=mid;
            else l=mid+1;
        }
        printf("%d",r);
    }
  • 相关阅读:
    懒加载 和 json
    [iOS]用instancetype代替id作返回类型有什么好处?
    (转)Objective-C语法之KVC使用
    UITableView 展示数据
    shopee
    防火墙
    vue项目开发技巧
    文件流
    vant
    node 使用
  • 原文地址:https://www.cnblogs.com/superminivan/p/11750831.html
Copyright © 2011-2022 走看看