zoukankan      html  css  js  c++  java
  • Codeforces Gym102460 B-The Power Monitor System (树上

    我无法形容出这道题的题解,实在是太麻烦了,但是自己开的题,跪着也要做完,放个std仅供对拍

    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <cstring>
    using namespace std;
    const int N = 100010;
    vector < int > E[N];
    int fa[N], d[N][3][3];
    void dfs(int u) {
        int tot1 = 0, tot2 = 0, maxn = -N, maxn2 = -N, maxn3 = -N;
        if (E[u].size() == 1 && u != 1) {
            d[u][0][0] = 0;
            d[u][1][1] = 1;
            d[u][1][0] = 1;
            return ;
        }
        if (u == 1 && E[u].size() == 1) {
            fa[E[u][0]] = u;
            dfs(E[u][0]);
            d[u][1][0] = d[u][1][1] = min(d[E[u][0]][1][1], d[E[u][0]][0][0] + 1);
            return ;
        }
        if (E[u].size() == 2 && u != 1) {
            int v;
            if (fa[u] == E[u][0])
                v = E[u][1];
            else
                v = E[u][0];
            fa[v] = u;
            dfs(v);
            d[u][1][0] = d[u][1][1] = min(d[v][1][1], d[v][0][0] + 1);
            d[u][0][0] = min(d[v][1][0], d[v][0][0]);
            return ;
        }
        for (int i = 0; i < E[u].size(); i++) {
            int v = E[u][i];
            if (v == fa[u])    continue;
            fa[v] = u;
            dfs(v);
            tot1 += d[v][1][0];
            tot2 += d[v][0][0];
            maxn = max(maxn, d[v][1][0] - d[v][1][1] + maxn2);
            maxn = max(maxn, d[v][1][0] - d[v][0][0] + maxn3);
            maxn2 = max(maxn2, d[v][1][0] - d[v][0][0]);
            maxn3 = max(maxn3, d[v][1][0] - d[v][1][1]);
        }
        d[u][0][0] = tot1 - maxn2;
        d[u][1][0] = tot1 - maxn;
        d[u][1][1] = min(tot2 + 1, tot1 - maxn3);
        d[u][1][0] = min(d[u][1][0], d[u][1][1]);
        d[u][0][0] = min(d[u][0][0], d[u][1][0]);
    }
    int main() {
        int n;
        scanf("%d", &n);
        memset(d, 0x3f, sizeof(d));
        for (int i = 1; i < n; i++) {
            int u, v;
            scanf("%d %d", &u, &v);
            E[u].push_back(v);
            E[v].push_back(u);
        }
        dfs(1);
        //for (int i = 1; i <= n; i++)
        //    printf("%d %d %d
    ", d[i][1][0], d[i][1][1], d[i][0][0]);
        printf("%d", min(d[1][1][0], d[1][1][1]));
        return 0;
    }
  • 相关阅读:
    Unsupported major.minor version 52.0
    图片资源的加密和cocos2d-x中的解密
    python 生成器生成杨辉三角
    python非递归全排列
    一个对象合并的函数引发的错误
    什么是原生的javascript
    quick3.5 removeFromParent()导致的windows下模拟器崩溃问题
    this关键字和static关键字
    内存分析
    面向对象:类和对象
  • 原文地址:https://www.cnblogs.com/cminus/p/12661671.html
Copyright © 2011-2022 走看看