zoukankan      html  css  js  c++  java
  • [树形dp][Tarjan] Bzoj 4316 小C的独立集

    Description

    图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨。
    这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使取出的点尽量多。
    小D虽然图论很弱,但是也知道无向图最大独立集是npc,但是小C很仁慈的给了一个很有特点的图: 图中任何一条边属于且仅属于一个简单环,图中没有重边和自环。小C说这样就会比较水了。
    小D觉得这个题目很有趣,就交给你了,相信你一定可以解出来的。

    题解

    • 可以考虑用仙人掌的做法来弄,我们可以不用把圆方树给建出来
    • 直接在tarjan中做,设f[i][0/1]表示当前点为i选或不选i的子树的最大独立集
    • 转移的话和一般的树形dp差不多,这样子做完就相当于把环给单独拎出来考虑

    代码

     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 }
  • 相关阅读:
    django-debug-toolbar的配置以及使用
    Django+telnetlib实现webtelnet
    Centos7 安装 telnet 服务
    Django+paramiko实现webshell
    Zabbix 历史数据存储到 Elasticsearch
    CA和自签证书
    linux加密算法与应用
    LVM拆除pv对应的磁盘
    目录迁移
    添加一个swap设备
  • 原文地址:https://www.cnblogs.com/Comfortable/p/11367371.html
Copyright © 2011-2022 走看看