【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. @SuppressWarnings("resource")

    Suppress  抑制:镇压:废止 Warnings警告 @SuppressWarnings("resource")是J2SE 提供的一个批注.该批注的作用是给编译器一条指令,告 ...

  2. Jmeter之上传数据流(图片、文本等)请求

    MIME类型~Content-Type: 参数名称~name

  3. Java面试题详解一:面向对象三大特性

    一,多态:1.面向对象四大基本特性:抽象,封装,继承,多态抽象,封装,继承是多态的基础.多态是抽象,封装,继承的表现.2.什么是多态不同类的对象对同一消息作出不同的响应叫做多态3.多态的作用简单来说: ...

  4. semantic-ui 标题

    在semantic-ui中定义了5中标题样式,注意HTML中有h1-h6,而semantic-ui中只有h1-h5. 不过需要注意的是,semantic-ui的标题仍旧使用h1-h5来表示,但是在cl ...

  5. mysql之找回误删数据

    场景:我们开发阶段,经常要有一些测试数据在我们测试相关功能的时候,是十分必要的.后期由于引入了正式的数据,但是测试数据并没有被及时清理.这个时候由于一个误删除,导致一些正式的数据被删除,由此,一场追找 ...

  6. rem 适配

    postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem lib-flexible 用于设置 rem 基准值 一.webpact postcss 插件将px转化为rem单 ...

  7. 【学亮开讲】Oracle存储过程教学笔记(一)20181115

    --创建业主序列起始值为11 ; --不带传出参数的存储过程 create or replace procedure pro_owners_add ( v_name varchar2,--名称 v_a ...

  8. WebService实例-CRM系统提供WebService实现用户注册功能

    <—start—> 编写crm的webservice接口,实现客户信息保存操作.在CustomerService接口中新增一个服务接口,用于添加客户注册的信息. @Path("/ ...

  9. postgreSQL使用杂谈

    由于当时是在美国安装的postgreSQL ,导致回到上海后使用时,发现时间数据显示不正确. To acomplish the timezone change in Postgres 9.6 you ...

  10. 数组中元素累加 reduce

    例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...