[六省联考2017]摧毁“树状图”

[六省联考2017]摧毁“树状图”

题目大意:

给你一个\(n(n\le5\times10^5)\)个点的图,从图中选两条链,删掉链上所有点以及所有相连的边,使得剩下的连通块数目最多,求连通块个数。

思路:

树形DP。

  • f[x][0]:穿过\(x\)向上的半条链
  • f[x][1]:不穿过\(x\)且完全在子树内的一条链
  • f[x][2]:穿过\(x\)且完全在子树内的一条链
  • f[x][3]:穿过\(x\)向上的半条连以及完全在子树内的一条链

然后就是各种大力讨论。

这个有图示的题解比较好懂。

源代码:

#include
#include
#include
inline int getint() {
    register char ch;
    while(!isdigit(ch=getchar()));
    register int x=ch^'0';
    while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    return x;
}
const int N=5e5+1;
std::vector e[N];
inline void add_edge(const int &u,const int &v) {
    e[u].push_back(v);
    e[v].push_back(u);
}
int f[N][4],ans;
inline void upd(int &a,const int &b) {
    a=std::max(a,b);
}
void dfs(const int &x,const int &par) {
    const bool isrt=x==1;
    const int deg=e[x].size()-!isrt;
    f[x][0]=f[x][2]=f[x][3]=deg;
    f[x][1]=1;
    int max=0;
    for(unsigned i=0;i

转载于:https://www.cnblogs.com/skylee03/p/9770455.html

你可能感兴趣的:([六省联考2017]摧毁“树状图”)