博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.4316.小C的独立集(仙人掌 DP)
阅读量:4969 次
发布时间:2019-06-12

本文共 2035 字,大约阅读时间需要 6 分钟。

\(Description\)

求一棵仙人掌的最大独立集。

\(Solution\)

如果是树,那么 \(f[i][0/1]\) 表示当前点不取/取的最大独立集大小,直接DP即可,即 \(f[x][0]+=max(f[v][0],f[v][1])\ ,\ \ f[x][1]+=f[v][0]\)

对于环,枚举环的根选不选(BZOJ1040 骑士),单独在上面做个DP即可。

也可以Tarjan+vector,以及建圆方树来方便环的转移(改一下方点f的定义使圆点可以直接转移即可)。

竟然1A啦,这么简单吗

//4704kb    168ms#include 
#include
#include
//#define gc() getchar()#define MAXIN 100000#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)const int N=5e4+5,M=120010;int n,m,Enum,H[N],nxt[M],to[M],Index,dfn[N],low[N],fa[N],f[N][2],tmp[N][2];char IN[MAXIN],*SS=IN,*TT=IN;inline int read(){ int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now;}inline void AddEdge(int u,int v){ to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum; to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;}void DP(int u,int v){ tmp[v][0]=f[v][0], tmp[v][1]=f[v][1];//don't choose u for(int i=fa[v],pre=v; pre!=u; pre=i,i=fa[i]) tmp[i][0]=std::max(tmp[pre][0],tmp[pre][1])+f[i][0], tmp[i][1]=tmp[pre][0]+f[i][1]; f[u][0]=tmp[u][0]; tmp[v][0]=f[v][0], tmp[v][1]=-87654321;//choose u for(int i=fa[v],pre=v; pre!=u; pre=i,i=fa[i]) tmp[i][0]=std::max(tmp[pre][0],tmp[pre][1])+f[i][0], tmp[i][1]=tmp[pre][0]+f[i][1]; f[u][1]=tmp[u][1];}void Tarjan(int x){ dfn[x]=low[x]=++Index, f[x][0]=0, f[x][1]=1; for(int v,i=H[x]; i; i=nxt[i]) if(to[i]!=fa[x]) { if(!dfn[v=to[i]]) fa[v]=x, Tarjan(v), low[x]=std::min(low[x],low[v]); else low[x]=std::min(low[x],dfn[v]); if(low[v]>dfn[x]) f[x][0]+=std::max(f[v][0],f[v][1]), f[x][1]+=f[v][0]; } for(int i=H[x]; i; i=nxt[i]) if(fa[to[i]]!=x&&dfn[to[i]]>dfn[x]) DP(x,to[i]);}int main(){ n=read(),m=read(); while(m--) AddEdge(read(),read()); Tarjan(1); int res=0; for(int i=1; i<=n; ++i) res=std::max(res,std::max(f[i][0],f[i][1])); printf("%d",res); return 0;}

转载于:https://www.cnblogs.com/SovietPower/p/9120075.html

你可能感兴趣的文章
静态方法是否属于线程安全
查看>>
02号团队-团队任务3:每日立会(2018-12-05)
查看>>
SQLite移植手记1
查看>>
js05-DOM对象二
查看>>
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended
查看>>
iPhone在日本最牛,在中国输得最慘
查看>>
动态方法决议 和 消息转发
查看>>
js 基础拓展
查看>>
C#生成随机数
查看>>
Android应用程序与SurfaceFlinger服务的连接过程分析
查看>>
Java回顾之多线程
查看>>
机电行业如何进行信息化建设
查看>>
9、总线
查看>>
Git 笔记 - section 1
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6203 ping ping ping
查看>>
《人人都是产品经理》书籍目录
查看>>
如何在git bash中运行mysql
查看>>
OO第三阶段总结
查看>>