【BZOJ4784】[ZJOI2017]仙人掌(Tarjan,动态规划)

题面

BZOJ

洛谷

题解

显然如果原图不是仙人掌就无解。

如果原图是仙人掌,显然就是把环上的边给去掉,变成若干森林连边成为仙人掌的方案数。

那么对于一棵树而言,考虑其变成仙人掌的方案数。

设\(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,动态规划)的更多相关文章

  1. [BZOJ4784][ZJOI2017]仙人掌(树形DP)

    4784: [Zjoi2017]仙人掌 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 312  Solved: 181[Submit][Status] ...

  2. 2019.02.07 bzoj4784: [Zjoi2017]仙人掌(仙人掌+树形dp)

    传送门 题意:给一个无向连通图,问给它加边形成仙人掌的方案数. 思路: 先考虑给一棵树加边形成仙人掌的方案数. 这个显然可以做树形dp. fif_ifi​表示把iii为根的子树加边形成仙人掌的方案数. ...

  3. BZOJ4784 ZJOI2017仙人掌(树形dp+dfs树)

    首先考虑是棵树的话怎么做.可以发现相当于在树上选择一些长度>=2的路径使其没有交,同时也就相当于用一些没有交的路径覆盖整棵树. 那么设f[i]为覆盖i子树的方案数.转移时考虑包含根的路径.注意到 ...

  4. bzoj4784 [Zjoi2017]仙人掌

    Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得 ...

  5. 【BZOJ4316】小C的独立集(仙人掌,动态规划)

    [BZOJ4316]小C的独立集(仙人掌,动态规划) 题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 \(Tarjan\)的本质其实就是一 ...

  6. 【BZOJ1023】仙人掌图(仙人掌,动态规划)

    [BZOJ1023]仙人掌图(仙人掌,动态规划) 题面 BZOJ 求仙人掌的直径(两点之间最短路径最大值) 题解 一开始看错题了,以为是求仙人掌中的最长路径... 后来发现看错题了一下就改过来了.. ...

  7. UOJ#290. 【ZJOI2017】仙人掌 仙人掌,Tarjan,计数,动态规划,树形dp,递推

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ290.html 题解 真是一道好题! 首先,如果不是仙人掌直接输出 0 . 否则,显然先把环上的边删光. ...

  8. bzoj 4784: [Zjoi2017]仙人掌【tarjan+树形dp】

    其实挺简单的但是没想出来---- 首先判断无解情况,即,一开始的图就不是仙人掌,使用tarjan判断如果一个点dfs下去有超过一个点比他早,则说明存在非简单环. 然后考虑dp,显然原图中已经属于某个简 ...

  9. uva 11324 The Largest Clique(图论-tarjan,动态规划)

    Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...

随机推荐

  1. 快速为git添加一个用户

    环境:用gitosis-admin管理git的权限. 前期git环境的搭建略去,主要给出快速添加一个用户的步骤: 在git bash中用“ssh-keygen -t rsa”生成公钥私钥,默认放到 “ ...

  2. Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval o

    pom.xml报错: Failure to transfer org.apache.maven:maven-archiver:pom:2.5 from https://repo.maven.apach ...

  3. tomcat redis 集群 session共享

    jcoleman/tomcat-redis-session-manager: Redis-backed non-sticky session store for Apache Tomcathttps: ...

  4. composer 自动加载一 通过file加载

    github地址 https://github.com/brady-wang/composer composer init 可以生成一个composer.json文件 { "name&quo ...

  5. MyEclipse 10.X激活方法

    普遍的激活办法请参考: http://blog.csdn.net/miss_kun/article/details/51819206 http://jingyan.baidu.com/article/ ...

  6. easyUI 数据表格datagrid的使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. WPF中自定义MarkupExtension

    在介绍这一篇文章之前,我们首先来回顾一下WPF中的一些基础的概念,首先当然是XAML了,XAML全称是Extensible Application Markup Language (可扩展应用程序标记 ...

  8. nginx worker_processes 配置

    搜索到原作者的话:As a general rule you need the only worker with large number ofworker_connections, say 10,0 ...

  9. pooling的几种形式(转)

    转载地址:http://blog.csdn.net/malefactor/article/details/51078135    原作者:张俊林 CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见 ...

  10. JS--dom对象:document object model文档对象模型

    dom对象:document object model文档对象模型 文档:超文本标记文档 html xml 对象:提供了属性和方法 模型:使用属性和方法操作超文本标记性文档 可以使用js里面的DOM提 ...