匹配(树形DP)

该博客探讨了一道关于无向联通图的最大匹配数问题,指出实际与最大匹配关系不大,主要利用树形动态规划(DP)进行求解。文章强调了DP状态转移方程和几个关键细节,如快速读取、减少取余操作、正确数组大小以及避免重复使用dp状态。
摘要由CSDN通过智能技术生成

传送门

题目描述:

有一张无向联通图 G=⟨V,E⟩ ,其中顶点数 |V|=n ,边数 |E|=n−1 。求有多少种方案使得删边后残余图中的最大匹配数恰好为 m 的倍数。

题解:

这道题看起来是求最大匹配,其实关系不大,正解是树形DP

定义一个数组dp[i][j][k], 其中

i表示节点,

j表示i的子树中的最大匹配数%m,

k表示i是否与其子节点匹配.

接下来推一下合并两颗子树u,v的递推式即可

注意几个细节:

1.用快读,否则会TLE

2.尽量少取余,否则会很慢

3.有2n条边,我一开始就因为数组开小了卡了很久

4.dp[i][j][k]上一次的结果不带入这一次,要另开一个tmp数组来执行操作

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
inline int read(){
   
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
   if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){
   x=x*10+ch-'0';ch=getchar();} 
    return x*f;
}
const int N=50010;
const int M=200;
const int mod=998244353;
int n,m
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值