【BZOJ4784】[ZJOI2017]仙人掌(Tarjan,动态规划)
【BZOJ4784】[ZJOI2017]仙人掌(Tarjan,动态规划)
题面
题解
显然如果原图不是仙人掌就无解。
如果原图是仙人掌,显然就是把环上的边给去掉,变成若干森林连边成为仙人掌的方案数。
那么对于一棵树而言,考虑其变成仙人掌的方案数。
设\(a_i\)表示匹配\(i\)个儿子的方案数,显然转移时\(a_i=a_{i-1}+(i-1)*a_{i-2}\),即考虑新加入的儿子是匹配另外一个儿子还是不管。
设\(f_u\)表示节点\(u\)的子树匹配成仙人掌的方案数,这里要考虑\(x\)到其父亲的边。
那么对于每个点的转移就是考虑其所有儿子的边的匹配问题,显然假设儿子个数为\(d\)的话,那么\(f_u=a_d\prod_{v,(u,v)\in E}f_v\)。
然后这个玩意真的要\(dp\)吗。。。。
就是\(\prod a_{degree_i}\)。所以求求每个点的度数就好了。
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 1000100
#define MOD 998244353
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<2];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int n,m,a[MAX],mxn=1;
bool vis[MAX],chk;
int dfn[MAX],low[MAX],G[MAX],gr,tim;
bool ins[MAX];int S[MAX],top;
void init(int n)
{
for(int i=1;i<=n;++i)vis[i]=false,h[i]=dfn[i]=low[i]=G[i]=0;
for(int i=mxn+1;i<=n;++i)a[i]=(a[i-1]+1ll*(i-1)*a[i-2])%MOD;
mxn=max(mxn,n);cnt=1;tim=gr=0;chk=true;
}
void Tarjan(int u,int ff)
{
ins[u]=true;S[++top]=u;dfn[u]=low[u]=++tim;
bool ret=false;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
if(!dfn[v])
{
Tarjan(v,u),low[u]=min(low[u],low[v]);
if(low[v]<dfn[u])ret?chk=false:ret=true;
}
else if(ins[v])
{
low[u]=min(low[u],dfn[v]);
if(low[v]<dfn[u])ret?chk=false:ret=true;
}
}
if(dfn[u]==low[u])
{
int v;++gr;
do{v=S[top--];ins[v]=false;G[v]=gr;}while(u!=v);
}
}
int ans,size[MAX];
void dfs(int u,int ff)
{
int son=ff!=0;vis[u]=true;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff||G[v]==G[u])continue;
++son;dfs(v,u);
}
ans=1ll*ans*a[son]%MOD;
}
int Work()
{
for(int i=1,u,v;i<=m;++i)u=read(),v=read(),Add(u,v),Add(v,u);
for(int i=1;i<=n;++i)if(!dfn[i])Tarjan(i,0);
if(!chk)return 0;ans=1;
for(int i=1;i<=n;++i)if(!vis[i])dfs(i,0);
return ans;
}
int main()
{
int T=read();a[0]=1;a[1]=1;
while(T--)
{
n=read();m=read();init(n);
printf("%d\n",Work());
}
}
【BZOJ4784】[ZJOI2017]仙人掌(Tarjan,动态规划)的更多相关文章
- [BZOJ4784][ZJOI2017]仙人掌(树形DP)
4784: [Zjoi2017]仙人掌 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 312 Solved: 181[Submit][Status] ...
- 2019.02.07 bzoj4784: [Zjoi2017]仙人掌(仙人掌+树形dp)
传送门 题意:给一个无向连通图,问给它加边形成仙人掌的方案数. 思路: 先考虑给一棵树加边形成仙人掌的方案数. 这个显然可以做树形dp. fif_ifi表示把iii为根的子树加边形成仙人掌的方案数. ...
- BZOJ4784 ZJOI2017仙人掌(树形dp+dfs树)
首先考虑是棵树的话怎么做.可以发现相当于在树上选择一些长度>=2的路径使其没有交,同时也就相当于用一些没有交的路径覆盖整棵树. 那么设f[i]为覆盖i子树的方案数.转移时考虑包含根的路径.注意到 ...
- bzoj4784 [Zjoi2017]仙人掌
Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得 ...
- 【BZOJ4316】小C的独立集(仙人掌,动态规划)
[BZOJ4316]小C的独立集(仙人掌,动态规划) 题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 \(Tarjan\)的本质其实就是一 ...
- 【BZOJ1023】仙人掌图(仙人掌,动态规划)
[BZOJ1023]仙人掌图(仙人掌,动态规划) 题面 BZOJ 求仙人掌的直径(两点之间最短路径最大值) 题解 一开始看错题了,以为是求仙人掌中的最长路径... 后来发现看错题了一下就改过来了.. ...
- UOJ#290. 【ZJOI2017】仙人掌 仙人掌,Tarjan,计数,动态规划,树形dp,递推
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. ...
- bzoj 4784: [Zjoi2017]仙人掌【tarjan+树形dp】
其实挺简单的但是没想出来---- 首先判断无解情况,即,一开始的图就不是仙人掌,使用tarjan判断如果一个点dfs下去有超过一个点比他早,则说明存在非简单环. 然后考虑dp,显然原图中已经属于某个简 ...
- uva 11324 The Largest Clique(图论-tarjan,动态规划)
Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...
随机推荐
- iOS 快速集成ijkplayer视频直播与录播框架
最近由于需求的变动,项目内把最初最简单的原生直播框架变成了B站开源的ijkplayer框架,下面把具体的过程总结一下整个过程都比较简单,重要的是理解的过程,集成完毕之后,视频的用户体验比苹果原生好了很 ...
- jupyter使用
jupyter使用 安装 在anaconda3的安装路径中,尽量避免使用汉字或者括号. 启动 在Windows上正确安装Anaconda3,确认配置好环境变量,然后再命令行中输入jupyter not ...
- (关于数据传输安全)SSH协议
这里说的不是java的SSH框架,是1995年,芬兰学者Tatu Ylonen设计的SSH协议. 有计算机网络基础的同学都知道,在网上传输的数据是可以被截取的.那么怎样才能获得安全? 一.春点行话 电 ...
- 01-VMware-workstation14安装
VMware-workstation14安装步骤: 首先现在虚拟机wmware,我现在的版本是:VMware-workstation-full-14.1.1.28517.exe 到处这里就安装完成: ...
- C#复习笔记(3)--C#2:解决C#1的问题(结束C#2的内容:最后一些特性)
结束C#2的内容:最后一些新性 这是本章要讲的内容: 分部类型:可以在多个源文件中为 一个类型编写代码. 特别适用于部分代码是自动生成, 而其他部分的代码为手写的类型. 静态类:对工具类进行整理, 以 ...
- [转帖]Htop 使用详解
htop使用详解 https://www.cnblogs.com/yqsun/p/5396363.html 一.Htop的使用简介 大家可能对top监控软件比较熟悉,今天我为大家介绍另外一个监控软件H ...
- python之路--关于线程的一些方法
一 . 线程的两种创建方式 from threading import Thread # 第一种创建方式 def f1(n): print('%s号线程任务'%n) def f2(n): print( ...
- python3 阿里云控制SLB权重
一.配置好RAM账号的权限(SLB管理权限) 二.安装依赖 pip3 install aliyun-python-sdk-slb pip3 install aliyun-python-sdk-core ...
- Python 版百度站长平台链接主动推送脚本
如果自己的网站需要被百度收录,可以在搜索结果中找到,就需要将网站的链接提交给百度.依靠百度的爬虫可能无法检索到网站所有的内容,因此可以主动将链接提交给百度. 在百度的站长平台上介绍了链接提交方法,目前 ...
- css & clearfix & clear-fixed
css & clearfix & clear-fixed https://zzk.cnblogs.com/my/s/blogpost-p?Keywords=clearfix .grou ...