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;
    }
  • 相关阅读:
    【Github】github图片显示不出
    【Linux】docker安装FastDFS
    【Github】问题解决:Failed to connect to github.com port 443: Operation timed out
    python生成1000w的mysql测试数据
    python 瀑布流
    django使用url路径组合搜索
    将规定的文件以及文件夹,压缩打包
    定期清理iis_log日志文件
    自己开发的python分页插件
    使用IO多路复用selectors模块写上传下载功能
  • 原文地址:https://www.cnblogs.com/cminus/p/12661671.html
Copyright © 2011-2022 走看看