题意:求仙人掌图直径。

算法:建出仙人掌圆方树,对于圆点直接做普通的树上DP(忽略方点儿子),方点做环上DP并将值直接赋给父亲。

建图时有一个很好的性质,就是一个方点在邻接表里的点的顺序正好就是从环的根开始的整个环的点的顺序,所以可以直接DP。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=,inf=;
int n,m,tot,tim,top,u,v;
int dfn[N],low[N],stk[N],f[N][],S[N][]; struct E{
int cnt,h[N],nxt[N<<],to[N<<];
void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; }
}G,G1; void Tarjan(int x,int pre){
dfn[x]=low[x]=++tim; stk[++top]=x;
for (int i=G.h[x],k; i; i=G.nxt[i])
if ((k=G.to[i])!=pre){
if (!dfn[k]){
Tarjan(k,x); low[x]=min(low[x],low[k]);
if (low[k]>dfn[x]) top--,G1.add(x,k);
else if (low[k]==dfn[x]){
tot++; int t;
do{ t=stk[top--]; G1.add(tot,t); } while (t!=k);
G1.add(x,tot); G1.add(tot,x);
}
}
else low[x]=min(low[x],dfn[k]);
}
} void dfs(int x,int fa){ printf("%d\n",x); for (int i=G1.h[x],k; i; i=G1.nxt[i]) if (G1.to[i]!=fa) dfs(G1.to[i],x); } void DP(int x,int fa){
//printf("%d\n",x);
if (x<=n){
f[x][]=; f[x][]=;
for (int i=G1.h[x],k; i; i=G1.nxt[i]){
DP(k=G1.to[i],x);
if (k<=n) f[x][]+=max(f[k][],f[k][]),f[x][]+=f[k][];
}
}else{
for (int i=G1.h[x]; i; i=G1.nxt[i]) if (G1.to[i]!=fa) DP(G1.to[i],x); int top=;
for (int i=G1.h[x],k; i; i=G1.nxt[i])
S[++top][]=f[k=G1.to[i]][],S[top][]=f[k][];
for (int i=top-; i; i--)
S[i][]+=max(S[i+][],S[i+][]),S[i][]+=S[i+][];
f[fa][]=S[][]; top=;
for (int i=G1.h[x],k; i; i=G1.nxt[i])
S[++top][]=f[k=G1.to[i]][],S[top][]=f[k][];
S[top][]=-inf;
for (int i=top-; i; i--)
S[i][]+=max(S[i+][],S[i+][]),S[i][]+=S[i+][];
f[fa][]=S[][];
}
} int main(){
freopen("bzoj4316.in","r",stdin);
freopen("bzoj4316.out","w",stdout);
scanf("%d%d",&n,&m); tot=n;
rep(i,,m) scanf("%d%d",&u,&v),G.add(u,v),G.add(v,u);
Tarjan(,); DP(,); //dfs(1,0);
//rep(i,1,tot) printf("%d %d\n",f[i][0],f[i][1]); puts("");
printf("%d\n",max(f[][],f[][]));
return ;
}

[BZOJ4316]小C的独立集(圆方树DP)的更多相关文章

  1. [BZOJ2125]最短路(圆方树DP)

    题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...

  2. BZOJ1023:[SHOI2008]cactus仙人掌图(圆方树,DP,单调队列)

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus). 所谓简单回路就是指在图上不重复经过任何一个顶点 ...

  3. [BZOJ5463][APIO2018]铁人两项(圆方树DP)

    题意:给出一张图,求满足存在一条从u到v的长度大于3的简单路径的有序点对(u,v)个数. 做了上一题[HDU5739]Fantasia(点双连通分量+DP),这个题就是一个NOIP题了. 一开始考虑了 ...

  4. [HDU5739]Fantasia(圆方树DP)

    题意:给一张无向点带有权无向图.定义连通图的权值为图中各点权的乘积,图的权值为其包含的各连通图的权和.设z_i为删除i点后图的权值,求$S = (\sum\limits_{i=1}^{n}i\cdot ...

  5. 洛谷4630APIO2018铁人两项(圆方树+dp)

    QWQ神仙题啊(据说是今年第一次出现圆方树的地方) 首先根据题目,我们就是求对于每一个路径\((s,t)\)他的贡献就是两个点之间的点数,但是图上问题我并没有办法很好的解决... 这时候考虑圆方树,我 ...

  6. bzoj4316小C的独立集(dfs树/仙人掌+DP)

    本题有两种写法,dfs树上DP和仙人掌DP. 先考虑dfs树DP. 什么是dfs树?其实是对于一棵仙人掌,dfs后形成生成树,找出非树边(即返祖边),然后dfs后每条返祖边+其所覆盖的链构成了一个环( ...

  7. 2019.02.07 bzoj4316: 小C的独立集(仙人掌+树形dp)

    传送门 题意:给出一个仙人掌森林求其最大独立集. 思路:如果没有环可以用经典的树形dpdpdp解决. fi,0/1f_{i,0/1}fi,0/1​表示第iii个点不选/选的最大独立集. 然后fi,0+ ...

  8. 图论杂项细节梳理&模板(虚树,圆方树,仙人掌,欧拉路径,还有。。。)

    orzYCB 虚树 %自为风月马前卒巨佬% 用于优化一类树形DP问题. 当状态转移只和树中的某些关键点有关的时候,我们把这些点和它们两两之间的LCA弄出来,以点的祖孙关系连成一棵新的树,这就是虚树. ...

  9. 仙人掌 && 圆方树 && 虚树 总结

    仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做 ...

随机推荐

  1. BZOJ1875: [SDOI2009]HH去散步 图上边矩乘

    这道题十分的坑…… 我作为一只连矩乘都不太会的渣渣看到这道题就只能神搜了….. 首先说一下普通的矩乘求方案,就是高出邻接矩阵然后一顿快速幂….. 矩乘一般就是一些秘制递推….. 再说一下这道题,我们可 ...

  2. HDU3338:Kakuro Extension(最大流)

    Kakuro Extension Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. 停止ambari上服务的顺序

    Before performing any upgrades or uninstalling software, stop all of the Hadoop services in the foll ...

  4. java 构造函数问题

    1.构造函数什么时候被调用,被谁调用? 转摘:http://bbs.csdn.net/topics/350231037 当然,只有在NEW的时候,才会真正的创建这个对象,只有在创建时才会调用该类的构造 ...

  5. 按小时或天切割Nginx日志

    #按小时或天切割Nginx日志到备份文件夹 LOGS_PATH=/home/www/logs/thc SAVE_PATH=/home/www/logs/thc YESTERDAY=$(date -d ...

  6. 【bzoj1911-[Apio2010]特别行动队】斜率优化

    [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个段的分数的总和最大. [输入格式]  第1行:1个 ...

  7. 关于k Line Chart (k线图)

    K Line Chart python实现k线图的代码,之前找过matplotlib中文文档但是画k线图的finance方法已经弃用了.所以自己在网上搜寻一下加上改编,很好的实现出k线图, 代码如下: ...

  8. VMX指令集

    指令 作用 VMPTRLD 加载一个VMCS结构体指针作为当前操作对象 VMPTRST 保存当前VMCS结构体指针 VMCLEAR 清除当前VMCS结构体 VMREAD 读VMCS结构体指定域 VMW ...

  9. 安全测试===BurpSuite使用教程-附安装包

    jar包: Burpsuite1.6亲测可用.zip 我的jdk版本: 运行包: >>> java -cp BurpLoader.jar;burpsuite_pro_v1.6.jar ...

  10. strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。

    strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用. http://bbs.51cto.com/thread-1106891-1.html