bzoj4316: 小C的独立集
首先这是个仙人掌,设f[i][0/1]表示当前节点i,选或不选的最大独立集
如果某条边是树边,那么直接树形dp的转移即可
考虑如果它的某棵子树恰好是一个环该怎么办
我们枚举这个环的顶端选或者不选,然后从这个环的底部开始遍历一遍即可
//minamoto
#include<bits/stdc++.h>
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
#define go(u) for(register int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
int read(){
int res,f=1;char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=2e5+5;
struct eg{int v,nx;}e[N];int head[N],tot;
inline void add(int u,int v){e[++tot]={v,head[u]},head[u]=tot;}
int n,m,fa[N],f[N][2],dfn[N],low[N],tim,u,v;
void dp(int u,int v){
int t0,t1,f0=0,f1=0;
for(register int i=v;i!=u;i=fa[i])
t0=f0+f[i][0],t1=f1+f[i][1],f0=max(t0,t1),f1=t0;
f[u][0]+=f0,f0=0,f1=-1e9;
for(register int i=v;i!=u;i=fa[i])
t0=f0+f[i][0],t1=f1+f[i][1],f0=max(t0,t1),f1=t0;
f[u][1]+=f1;
}
void dfs(int u,int fat){
fa[u]=fat,dfn[u]=low[u]=++tim,f[u][1]=1,f[u][0]=0;
go(u)if(v!=fat){
if(!dfn[v])dfs(v,u),cmin(low[u],low[v]);
else cmin(low[u],dfn[v]);
if(low[v]>dfn[u])f[u][1]+=f[v][0],f[u][0]+=max(f[v][0],f[v][1]);
}
go(u)if(fa[v]!=u&&dfn[u]<dfn[v])dp(u,v);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read();
fp(i,1,m)u=read(),v=read(),add(u,v),add(v,u);
dfs(1,0);printf("%d\n",max(f[1][0],f[1][1]));return 0;
}
深深地明白自己的弱小
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 千万级的大表,如何做性能调优?
· .NET周刊【1月第1期 2025-01-05】