zoukankan      html  css  js  c++  java
  • ACC 001 C

    题目:

    Problem Statement

    Given an undirected tree, let the distance between vertices (u) and (v) be the number of edges on the simple path from (u) to (v). The diameter of a tree is the maximum among the distances between any two vertices. We will call a tree good if and only if its diameter is at most (K).
    You are given an undirected tree with (N) vertices numbered (1) through (N). For each (i(1leq ileq N−1)), there is an edge connecting vertices (A_i) and (B_i).
    You want to remove zero or more vertices from the tree, so that the resulting tree is good. When a vertex is removed, all incident edges will also be removed. The resulting graph must be connected.
    Find the minimum number of vertices that you need to remove in order to produce a good tree.

    Constraints

    • (2leq Nleq 2000)
    • (1leq Kleq N−1)
    • (1leq A_i leq N,1leq B_i leq N)
    • The graph defined by (A_i) and (B_i) is a tree.

    题解

    比较简单的一道题。
    考虑如果以某一点为根,那么就是删去一定深度以上的节点。
    稍微分析一下可以发现这样做一定会找到最优方案。
    所以可以对所有的方案取(min)

    那么下面的问题就是删除深度大于哪个值的节点。
    对于给定的(K)是偶数的情况,那么直接删除深度大于(frac{K}{2})的所有点即可。
    如果是奇数呢?
    这时候我们转换思维,不枚举以哪一个点为根了,枚举以哪条边为根。
    这时候我们可以发现接下来也只要删除所有深度大于(frac{K-1}{2})的点即可.

    复杂度(O(n^2))

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    inline void read(int &x){
        x=0;char ch;bool flag = false;
        while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
        while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
    }
    #define rg register int
    #define rep(i,a,b) for(rg i=(a);i<=(b);++i)
    #define per(i,a,b) for(rg i=(a);i>=(b);--i)
    const int maxn = 2048;
    struct Edge{
        int to,next;
    }G[maxn<<1];
    int head[maxn],cnt;
    void add(int u,int v){
        G[++cnt].to = v;
        G[cnt].next = head[u];
        head[u] = cnt;
    }
    #define v G[i].to
    int dep[maxn];
    void dfs(int u,int f){
        for(rg i = head[u];i;i=G[i].next){
            if(v == f) continue;
            dep[v] = dep[u] + 1;
            dfs(v,u);
        }
    }
    #undef v
    struct Node{
        int u,v;
    }e[maxn];
    int main(){
        int n,K;read(n);read(K);
        int u,v;
        rep(i,2,n){
            read(u);read(v);
            e[i].u = u;e[i].v = v;
            add(u,v);add(v,u);
        }
        int ans = 0x3f3f3f3f;
        if((K&1) == 0){
            int res = 0;
            rep(i,1,n){
                res = dep[i] = 0;dfs(i,i);
                rep(j,1,n) if(dep[j] > (K >> 1)) ++ res;
                ans = min(ans,res);
            }
        }else{
            int res = 0;
            rep(i,2,n){
                dep[e[i].u] = dep[e[i].v] = res = 0;
                dfs(e[i].u,e[i].v);dfs(e[i].v,e[i].u);
                rep(j,1,n){
                    if(dep[j] > (K >> 1)) ++ res;
                }ans = min(ans,res);
            }
        }printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    MYSQL
    数据中台的思考与总结
    基于SpringCloud分布式架构
    java常用工具库使用
    String性能提升10倍的几个方法
    Validator 注解使用
    【数据结构】trie树
    几种排序算法小结
    Core data的batch update
    UIScrollView和UIPageControl结合实现图片浏览
  • 原文地址:https://www.cnblogs.com/Skyminer/p/7001744.html
Copyright © 2011-2022 走看看