ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #798(Div 2)

2022-06-11 12:02:49  阅读:174  来源: 互联网

标签:sz int Codeforces 798 lson Div 节点 dp size


C

题意:给定一棵以 \(1\) 为根,\(n\) 个节点的二叉树,根节点被感染了。然后将会执行以下过程 \(n\) 次:

  • 选定一个未被感染的节点,删除它,断开它周围的所有连边。
  • 已感染的节点会沿其连边感染其相邻节点。

求最后最多可以有多少个节点未被感染(删除的节点不算)

分析:裸树形dp,\(dp[x]\) 表示 \(x\) 刚刚被感染,最多可以解救其子树内的多少个节点。

cpp
#include<bits/stdc++.h>
using namespace std;
#define f(i, a, b) for(int i = a; i <= b; i++)
#define mod9 998244353
#define mod1 1000000007
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define endl '\n'
int n;
vector<vector<int>> g;
vector<int> sz;
vector<int> dp;
void dfs1(int x, int fa){
    int nowsz=1;
    f(i, 0, (int)g[x].size()-1){
        if(g[x][i] != fa) {
            dfs1(g[x][i], x);
            nowsz += sz[g[x][i]];
        }
    }
    sz[x] = nowsz;
}
void dfs2(int x, int fa) {
    if(g[x].size() == 1 && x != 1) return;
    if((g[x].size() == 2&&x!=1) || (g[x].size()==1&&x==1)) {
        f(i,0,(int)g[x].size()-1){
            if(g[x][i]!=fa){
                dfs2(g[x][i],x);
                dp[x]=sz[g[x][i]]-1;
            }
        }
        return;
    }
    if(g[x].size() == 3 || (g[x].size()==2&&x==1)) {
        int lson=0,rson=0;
        f(i,0,(int)g[x].size()-1){
            if(g[x][i]!=fa){
                if(!lson) lson=g[x][i]; else rson=g[x][i];
                dfs2(g[x][i],x);
            }
        }
        dp[x]=max(sz[lson]-1+dp[rson],sz[rson]-1+dp[lson]);
        return;
    }   
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int t;cin>>t;
    while(t--){
        cin>>n;
        g.clear(); g.resize(n + 10);
        sz.clear(); sz.resize(n + 10);
        dp.clear(); dp.resize(n + 10);
        int ans = 0;
        f(i,1,n-1){
            int u, v; cin >> u >> v;
            g[u].push_back(v); g[v].push_back(u); 
        }
        dfs1(1, 0);
        dfs2(1, 0);
        cout << dp[1] << endl;
    }
    return 0;
}

启发:考试的时候想了一个奇怪的 \(dp\),遇到树还是想树形 \(dp\)(子节点上传到父节点)。

标签:sz,int,Codeforces,798,lson,Div,节点,dp,size
来源: https://www.cnblogs.com/Zeardoe/p/16365569.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有