2 条题解

  • -1
    @ 2023-3-19 20:55:27
    #define MAXM 10010
    #define INF 20000
    using namespace std;
    struct node
    {
        int to, next;
    } e[MAXM << 1];
    int head[MAXM], tot;
    int f[MAXM][3], m, n, c[MAXM];
    void add(int u, int v)
    {
        tot++, e[tot].to = v, e[tot].next = head[u], head[u] = tot;
    }
    void init()
    {
        int i, u, v;
        scanf("%d%d", &m, &n);
        for (i = 1; i <= n; i++)
            scanf("%d", &c[i]);
        for (i = 1; i < m; i++)
        {
            scanf("%d%d", &u, &v);
            add(u, v), add(v, u);
        }
        for (i = 1; i <= m; i++)
            f[i][0] = f[i][1] = 1;
    }
    void dfs(int u, int fa)
    {
        int i, v;
        for (i = head[u]; i; i = e[i].next)
        {
            v = e[i].to;
            if (v == fa)
                continue;
            dfs(v, u);
            if (v <= n)
                f[v][!c[v]] = INF, f[v][2] = 1;
            f[u][0] += min(f[v][2], min(f[v][0] - 1, f[v][1]));
            f[u][1] += min(f[v][2], min(f[v][0], f[v][1] - 1));
            f[u][2] += min(f[v][2], min(f[v][0], f[v][1]));
        }
    }
    int main()
    {
        init();
        dfs(n + 1, -1);
        printf("%d\n", min(f[n + 1][2], min(f[n + 1][0], f[n + 1][1])));
        return 0;
    }
    

    信息

    ID
    477
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    33
    已通过
    17
    上传者