原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. 问题转化成多个树求解,把答案乘起来即可. 现在我们考虑如何求一个树的答案. 再转化一下题意可以变成选出若干条长度至少为 2 的路径使得它们两两没有交. 标算十分优美.放到后面讲. 我先讲讲我的sb做法. 我们先来看看暴力 dp 怎么做: 设 dp[x][i] 表示子树 x ,在 x 节点上还有 i…
题目链接:http://codeforces.com/contest/456/problem/D 题意:给n个字符串.进行k次游戏.每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为集合中某字符串的前缀,不能操作者输,新一轮由上一句输的人先手. 题解:先确定一下状态,如果是先手必定赢得话那么就喝k的奇偶性有关系.如果后手必赢那么肯定是后手赢.如果是先手决定输赢的话,那么只要先手的一开始一直让后手赢最后赢一把就行先手必胜,如果是后手决定输赢的话那么显然同理后手必胜. 那么在说一下…
题目要求将树分为k个部分,并且每种颜色恰好在同一个部分内,问有多少种方案. 第一步显然我们需要知道哪些点一定是要在一个部分内的,也就是说要求每一个最小的将所有颜色i的点连通的子树. 这一步我们可以将所有有颜色的点丢入优先队列,然后另深度最深的点优先出队. 如果此时这个点的颜色有不只一个点在队列中,那么我们必须要考虑将它的父亲染色,这样才能与其他的该颜色的点连通. 此时有3种情况: 1.如果它的父亲已经被染色且颜色与该点不同,那么此时显然无解: 2.如果它的父亲与它颜色相同,那么此时不做任何操作.…
传送门 这图可以说是非常形象了2333 模拟赛的时候打了个表发现为一条链的时候答案是\(2^{n-2}\)竟然顺便过了第一个点 然后之后订正的时候强联通分量打错了调了一个上午 首先不难发现我们可以去掉所有在环上的边,那么就变成了一个森林,不同的树之间不可能有连边,那么只要所有树的答案乘起来就好了,只要在每一棵树内部树形\(dp\)即可 考虑对于\(u\),它的子树如何统计答案 我们强制子树必须得向外连一条边(显然最多只有一条),然后往上统计 如果子树里没有向外连边,每一棵子树的答案乘起来 如果向…
4784: [Zjoi2017]仙人掌 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 312  Solved: 181[Submit][Status][Discuss] Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过 重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得这张图中的边数太少了,所以她想要在图上连上 一些新的边.同时为了方便的存储这张…
题目分析: 不难注意到仙人掌边可以删掉.在森林中考虑树形DP. 题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数. 接着将所有的边接到当前点,然后每两个方案可以任意拼接.然后考虑引一条边上去的情况,选一个点不与周围连边就行了. 判仙人掌利用dfs树与树前缀和即可. 代码: #include<bits/stdc++.h> using namespace std; ; ; int T,n,m,arr[maxn],C[maxn],d[maxn],up[maxn],dep[…
传送门 题意:给一个无向连通图,问给它加边形成仙人掌的方案数. 思路: 先考虑给一棵树加边形成仙人掌的方案数. 这个显然可以做树形dp. fif_ifi​表示把iii为根的子树加边形成仙人掌的方案数. 然后有两种情况: iii点没有父亲 iii点有父亲 对于第一种情况即iii是树根的情况,显然fi=(∏fv)∗g∣sonp∣f_i=(\prod f_v)*g_{|son_p|}fi​=(∏fv​)∗g∣sonp​∣​,其中gig_igi​表示给iii个儿子两两配对(每个儿子可配可不配的方案数).…
其实挺简单的但是没想出来---- 首先判断无解情况,即,一开始的图就不是仙人掌,使用tarjan判断如果一个点dfs下去有超过一个点比他早,则说明存在非简单环. 然后考虑dp,显然原图中已经属于某个简单环的边就是没用的,tarjan缩点之后删掉两个端点在一个强连通分量中的边.(无向图的tarjan要记录father防止往回走,instack数组不需要了. 现在图变成了一个森林. 然后设sum为某个点的子树个数,w[i]为i棵子树相互连成环的方案数,w[i]=w[i-1]+w[i-2]*(i-1)…
题面 n n n 个点, m m m 条边. 1 ≤ n ≤ 1 0 5 , n − 1 ≤ m ≤ 2 × 1 0 5 1\leq n\leq 10^5,n-1\leq m\leq 2\times10^5 1≤n≤105,n−1≤m≤2×105 . 题解 直接求行列式是不现实的,我们可以通过行列式的定义式来思考解法. 一个会产生贡献的排列,相当于要每个点选一个邻接点当爹,每个点的爹必须不一样. 如果这个点度为 1,那么它和它的邻接点必须配对,然后相当于删掉了.同时这两个点使得该排列的贡献乘上…
分析:首先树形dp(dfs计算出每个点为根节点的子树的最长距离和次长距离),然后找出L=dis[u][0]+dis[u][1]最长的那个点u,然后在以u为根节点dfs,统计长度为L的条数:具体做法:把u的儿子节点为根节点的子树深搜遍历到每个叶子节点,用h[dist[v]]统计该子树中u到v的距离,然后对于遍历过的叶子节点且不再当前子树中的s[L-dist[v]]的个数加到ans中,最后ans即为所求条数: #pragma comment(linker, "/STACK:1024000000,10…