Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛 上的任意两个生物,他们有且仅有一个公共朋友,即对同一岛上的任意两个生物a和b有且仅有一个生物c既是a的朋友也是b的朋友,当然某些岛上也可能会只有 一个生物孤单地生活着.这一习性有一个明显的好处,当两个生物发生矛盾的时候,他们可以请那个唯一的公共朋友来裁决谁对谁错. 另外,岛与岛之间也有交流,具体来说,每个岛都会挑选出一个最聪明的…
题目链接 BZOJ1487 题解 就是一个简单的仙人掌最大权独立集 还是不会圆方树 老老实实地树形Dp + 环处理 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define LL long long int #define Redge(u) for (int k = h[u],to; k; k = ed[k].…
传送门 人脑转化条件过后的题意简述:给你一个仙人掌求最大带权独立集. 思路:跟这题没啥变化好吗?再写一遍加深记忆吧. 就是把每个环提出来分别枚举环在图中的最高点选还是不选分别dpdpdp一下即可,时间复杂度O(n+m)O(n+m)O(n+m) 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0,w=1; char ch=getchar(); w…
[BZOJ1487][HNOI2009]无归岛(动态规划) 题面 BZOJ 洛谷 题解 哪来的这么多废话啊,直接说一个仙人掌得了. 然后就是要你求仙人掌最大独立集了.(随便蒯份原来的代码就过了) 不过我还是重新整理一遍思路吧. 一种是裸的\(dp\),只需要额外考虑上环的影响就好了. 这种方法我们从树上的做法推广过来. 先考虑树的最大独立集,设\(f[i][0/1]\)表示当前考虑\(i\)及其子树,这个点一定不选,以及随意的最大独立集.转移的时候枚举这个点选还是不选即可. 推广到仙人掌上,相比…
P4410 [HNOI2009]无归岛 显然这还是一个仙人掌图 对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友 要求求最大独立集,和树形dp一样,遇到环时单独提出来处理一下就好了 #include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> using namespace std; typedef long long L…
题目: BZOJ1487 分析: 题目中给定的图一定是一棵仙人掌(每条边最多属于一个环),证明如下: 先考虑单独一个岛的情况.第一,一个岛一定是一张「弦图」,即任意一个大小超过 3 的环都至少有 1 条弦.否则,这个环上不相邻的两点就不存在公共朋友,不符合「有一个公共朋友」. 第二,不存在有一条边被超过一个三元环包含.否则,这些三元环上与这条边相对的顶点都与这条边的两端点相邻,不符合「只有一个公共朋友」. 所以,每条边最多属于一个三元环.而由于大小超过 3 的环的弦一定存在于至少两个三元环中,所…
Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友,即对同一岛上的任意两个生物a和b有且仅有一个生物c既是a的朋友也是b的朋友,当然某些岛上也可能会只有一个生物孤单地生活着.这一习性有一个明显的好处,当两个生物发生矛盾的时候,他们可以请那个唯一的公共朋友来裁决谁对谁错. 另外,岛与岛之间也有交流,具体来说,每个岛都会挑选出一个最聪明的生物…
Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友,即对同一岛上的任意两个生物a和b有且仅有一个生物c既是a的朋友也是b的朋友,当然某些岛上也可能会只有一个生物孤单地生活着.这一习性有一个明显的好处,当两个生物发生矛盾的时候,他们可以请那个唯一的公共朋友来裁决谁对谁错. 另外,岛与岛之间也有交流,具体来说,每个岛都会挑选出一个最聪明的生物…
这题真的是无语了,在哪个岛上根本就没有任何的用处……不过我是画了下图,感受到一定是仙人掌,并不会证.有谁会证的求解…… 如果当做仙人掌来做确实十分的简单.只要像没有上司的舞会一样树形dp就好了,遇到环出现的时候把环遍历一遍单独求解,和小C的独立集完全是一样的做法. #include <bits/stdc++.h> using namespace std; #define maxn 500000 #define int long long #define INF 999999999 ; ], f…
裸的仙人掌最大独立子集,结果一个zz的错误让我调了好久... \(-inf\)开始设为\(0x7fffffff\)结果\(A_i\)有负数一加就炸了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=2e5+100,maxm=5e5+100,inf=200000000; int n,m,v[maxm],nex[maxm],head[maxn…
1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 23[Submit][Status][Discuss] Description 小猪iPig来到了一个叫做pigsty的城市里,pigsty是一座专门为小猪所准备的城市,城市里面一共有n个小区给小猪们居住,并且存在许多条无向边连接着许多小区.因为这里是一个和谐的城市,所以小猪iPig准备在这个城市里面度过他的余生.若干年之后小猪iPig…
4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使取出的点尽量多. 小D虽然图论很弱,但是也知道无向图最大独立集是npc,但是小C很仁慈的给了一个很…
Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3467  Solved: 1438[Submit][Status][Discuss] Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说,上面的第一个例子是一张仙人图,而第二个不是——注意到它有三条简单回路:(4,3,2,1,6,5,4)…
本题有两种写法,dfs树上DP和仙人掌DP. 先考虑dfs树DP. 什么是dfs树?其实是对于一棵仙人掌,dfs后形成生成树,找出非树边(即返祖边),然后dfs后每条返祖边+其所覆盖的链构成了一个环(很显然覆盖的链互不相交),然后可以确定每条边出现在哪个环中,然后可以解决一些简单的仙人掌DP问题,不用写tarjan了. 这道题的第一种方法就是dfs树DP,题目是求仙人掌的最大独立集. 首先树形DP,没有环应该很好求,有环的情况,考虑记录环上的点的top和end(注意环顶部不用记录,因为环顶部可能…
bzoj5315/luoguP4517 防御网络(仙人掌,dp) bzoj Luogu 题目描述略(太长了) 题解时间 本题和斯坦纳树无关. 题面保证了是一个仙人掌...? 但这个环之间甚至交点都没有. 对于不在环上的边很好弄. 在环上的很难单独考虑. 所以直接考虑一次算出一个环的贡献. 假设我们现在选了一个环上的不止一个点. 那么其中没有被选中的边肯定是连续的一段并且是所有被选中的点分割出的最长的. 这样很容易搞出一个枚举长度 $ l $ 的dp,通过前缀和可以优化到 $ O(n^3) $ .…
Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友,即对同一岛上的任意两个生物\(a\)和\(b\)有且仅有一个生物\(c\)既是\(a\)的朋友也是\(b\)的朋友,当然某些岛上也可能会只有一个生物孤单地生活着.这一习性有一个明显的好处,当两个生物发生矛盾的时候,他们可以请那个唯一的公共朋友来裁决谁对谁错. 另外,岛与岛之间也有交流,具…
题目链接 \(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的定义使圆点可以直接转移即可). 竟然…
题目链接 BZOJ5315 题解 题目好吓人= =点仙人掌 + 斯坦纳树 我们只需求出对于所有选点的方案的斯坦纳树边长总和 \(n\)那么大当然不能状压,但是考虑一下如果这是一棵树,一个方案的贡献就是连接这些点的所有边 我们可以考虑计算每条边的贡献 一条边在树上有贡献,当且仅当它两端的树都存在被选择的点 那么这条边\((u,v)\)贡献就是 \[(2^{siz[u]} - 1)(2^{siz[v] - 1})\] 其中\(siz[u]\)表示断开这条边后\(u\)一侧的树大小 如果放到仙人掌上呢…
题目 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌 图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说,上面的第一个例子是一张仙人图,而第二个不是--注意到它有三条简单回路:(4,3,2,1,6 ,5,4).(7,8,9,10,2,3,7)以及(4,3,7,8,9,10,2,1,6,5,4),而(2,3)同时出现在前两 个的简单回路里.另外,第三张图也不是仙人图,因为它并不是连通图.显然,仙人图上的…
dp(i, j)表示选第i个, 且当前序列长度为j, 另一个序列的最后一个元素的最小值...然后根据上一个是哪个序列选的讨论一下就行了...奇怪的dp... ------------------------------------------------------------- #include<cstring> #include<cstdio> #include<algorithm>   using namespace std;   const int INF =…
传送门 Solution 前几天刚做了类似题,这种将一个序列拆分为两个单调序列的题一般都是设\(dp[i]\)表示i为一个单调序列的末尾时,另一个序列的末尾是多少 然后应用贪心的思想,在这道题中就是让另一个序列末尾最小. 另外这道题还有长度的限制,不过由于总长知道,只需记其中一个的序列长度即可 Code //By Menteur_Hxy #include <cmath> #include <cstdio> #include <cstring> #include <…
参考:https://www.cnblogs.com/clrs97/p/7518696.html 其实和圆方树没什么关系 设f[i][j][k]为i点选/不选,这个环的底选不选 这个底的定义是设u为这个环在dfs中第一个被扫到的点,箭头表示dfs序: #include<iostream> #include<cstdio> using namespace std; const int N=100005; int n,m,h[N],cnt,in[N],dfn,fa[N],f[N][2]…
菜鸡 wxw 的计划(肯定会咕咕咕 12.27 luogu P4244 [SHOI2008]仙人掌图 II(咕咕咕 luogu P4246 [SHOI2008]堵塞的交通 (没有咕! luogu P1848 [USACO12OPEN]书架Bookshelf(不咕! 12.28 一场 cf 虚拟比赛(div.2 rk 18) 一场 cf div.2,用的是小号(i_am_sooke)(rk 20) 题解在这里 sooke 看到我小号的用户名貌似不太开心 qaq 我好菜啊 qaq 12.29 luo…
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem 10983 18765 Y 1036 [ZJOI2008]树的统计Count 5293 13132 Y 1588 [HNOI2002]营业额统计 5056 13607 1001 [BeiJing2006]狼抓兔子 4526 18386 Y 2002 [Hnoi2010]Bounce 弹飞绵羊 43…
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使取出的点尽量多. 小D虽然图论很弱,但是也知道无向图最大独立集是npc,但是小C很仁慈的给了一个很有特点的图: 图中任何一条边属于且仅属于一个简单环,图中没有重边和自环.小C说这样就会比较水了. 小D觉得这个题目很有趣,就交给你了,相信你一定可以解出来的. Input 第一行,两个数n, m,表示图…
4784: [Zjoi2017]仙人掌 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 312  Solved: 181[Submit][Status][Discuss] Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过 重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得这张图中的边数太少了,所以她想要在图上连上 一些新的边.同时为了方便的存储这张…
这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来,再从环上DFS序最小的点开始进行环状DP,就ok了.但是注意判断是不是父边不能用 v[k] != fa[now],这样如果两个点构成一个环就会出错,所以存这个点的父边,记为fb[now],这样判断的时候只需判断(k^1) != fb[now],就可以了.在环状DP的时候我想了很久怎么用单调队列优化(…
Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得这张图中的边数太少了,所以她想要在图上连上一些新的边.同时为了方便的存储这张无向图,图中的边数又不能太多.经过权衡,她想要加边后得到的图为一棵仙人掌.不难发现合法的加边方案有很多,可怜想要知道总共有多少不同的加边方案.两个加边方案是不同的当且仅当一个方案中存在一条另一个方案中没有的边. Input…
[BZOJ1023]仙人掌图(仙人掌,动态规划) 题面 BZOJ 求仙人掌的直径(两点之间最短路径最大值) 题解 一开始看错题了,以为是求仙人掌中的最长路径... 后来发现看错题了一下就改过来了.. 首先和普通的仙人掌\(dp\)是一样的, 对于没有问题的圆圆边,直接做最长链的转移(同时更新\(ans\)) 然后对于一个环,把它拎出来单独考虑 首先要对于这个环,计算能够贡献的答案, 然后再用环上的值更新环的最顶点 先考虑怎么更新,这个直接拿环上的点的\(dp\)值,再计算一下这两点之间的最短路(…
仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做起来十分舒服. 仙人掌的基环DP 首先勾出一棵有根生成树. 那么树边上正常转移即可. 我们把返祖边形成的环归到环上深度最浅的点上,即环顶. 那么到环顶时,单独跑一遍关于环的\(DP\)即可. 一般写法为: void dfs(RG int u,RG int From) { dfn[u] = low[u] = +…