1 #include <cstdio> 2 #include <iostream> 3 #define N 60010 4 using namespace std; 5 struct edge{int to,from;}e[N*3]; 6 int n,m,cnt=1,Fa[N],f[N][2],dfn[N],low[N],head[N]; 7 void insert(int x,int y) 8 { 9 e[++cnt].to=y,e[cnt].from=head[x],head[x]=cnt; 10 e[++cnt].to=x,e[cnt].from=head[y],head[y]=cnt; 11 } 12 void dp(int x,int y) 13 { 14 int r0,r1,f0=0,f1=0; 15 for (int i=y;i!=x;i=Fa[i]) r0=f0+f[i][0],r1=f1+f[i][1],f0=max(r0,r1),f1=r0; 16 f[x][0]+=f0,f0=0,f1=-1e9; 17 for (int i=y;i!=x;i=Fa[i]) r0=f0+f[i][0],r1=f1+f[i][1],f0=max(r0,r1),f1=r0; 18 f[x][1]+=f1; 19 } 20 void dfs(int x,int fa) 21 { 22 dfn[x]=low[x]=++dfn[0],f[x][1]=1,f[x][0]=0,Fa[x]=fa; 23 for (int i=head[x];i;i=e[i].from) 24 { 25 if (!dfn[e[i].to]) dfs(e[i].to,x),low[x]=min(low[x],low[e[i].to]); else if (e[i].to!=fa) low[x]=min(low[x],dfn[e[i].to]); 26 if (low[e[i].to]>dfn[x]) f[x][1]+=f[e[i].to][0],f[x][0]+=max(f[e[i].to][0],f[e[i].to][1]); 27 } 28 for (int i=head[x];i;i=e[i].from) if (Fa[e[i].to]!=x&&dfn[x]<dfn[e[i].to]) dp(x,e[i].to); 29 } 30 int main() 31 { 32 scanf("%d%d",&n,&m); 33 for (int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),insert(x,y); 34 dfs(1,0),printf("%d",max(f[1][0],f[1][1])); 35 }
[树形dp][Tarjan] Bzoj 4316 小C的独立集
原文:https://www.cnblogs.com/Comfortable/p/11367371.html