【NOIP2016提高A组集训第13场11.11】最大匹配
题目
mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边。
图的“匹配”是指这个图的一个边集,里面的边两两不存在公共端点。
匹配的大小是指该匹配有多少条边。
二分图匹配我们可以通过匈牙利算法得以在O(VE)时间复杂度内解决。
mhy12345觉得单纯的二分图匹配算法毫无难度,因此提出新的问题:
现在给你一个N个点N-1条边的连通图,希望你能够求出这个图的最大匹配以及最大匹配的数量。
两个匹配不同当且仅当存在一条边在第一个匹配中存在而在第二个匹配中不存在。
分析
设\(f_{i,0|1}\)表示,第i个节点,选了或不选的最大匹配,
设j为i的儿子,
\[f_{i,0}=\sum_jmax(f_{j,0},f_{j,1})\]
设k也是i的儿子,而j不包含k,
\[f_{i,1}=max(f_{k,0}+1+\sum max(f_{j,0},f_{j,1}))\ 将k与i匹配,剩下的取最大\]
接着考虑最大匹配数量,即方案数,
设\(g_{i,0|1}\)对于f这个状态最大匹配的方案数
设\[rec_{j}=\left\{\begin{array}\\g_{j,0}\ (f_{j,0}>f_{j,1})\\g_{j,1}\ (f_{j,0}<f_{j,1})\\g_{j,0}+g_{j,1}\ (f_{j,0}=f_{j,1})\end{array}\right.\]
\[g_{i,0}=\Pi rec_j\]
设k也是i的儿子,而j不包含k,并且\(f_{k,0}+1+\sum max(f_{j,0},f_{j,1})\)为最大值(或之一)
\[g_{i,1}=\sum(g_{k,0}·\Pi rec_j)\]
这个可以用逆元或者前缀积后缀积来处理。
发现其实\(f_{j,0}<=f_{j,1}\),
所以\(max(f_{j,0},f_{j,1})=f_{j,1}\)
```#include
include
include
include
include
include
include
const long long maxlongint=2147483647;
const long long mo=1000000007;
const long long N=100005;
using namespace std;
long long n,ans,t,p,rec[N],next[N*2],last[N*2],to[N*2],tot,f[N][2],g[N][2];
int bj(long long x,long long y)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
}
long long mi(long long x,long long y)
{
long long sum=1;
while(y)
{
if(y&1) sum=sumx%mo;
x=xx%mo;
y/=2;
}
return sum;
}
int dg(long long x,long long fa)
{
g[x][0]=g[x][1]=1;
f[x][0]=f[x][1]=rec[x]=0;
long long sumf=0,mir=1,q=1;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa)
{
dg(j,x);
sumf+=f[j][1];
f[x][0]+=f[j][1];
g[x][0]=g[x][0]rec[j]%mo;
mir=mirrec[j]%mo;
q=false;
}
}
if(q) g[x][1]=0;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa)
{
if(f[x][1]<f[j][0]+1+sumf-f[j][1])
{
f[x][1]=f[j][0]+1+sumf-f[j][1];
g[x][1]=mirmi(rec[j],mo-2)%mog[j][0]%mo;
}
else
if(f[x][1]==f[j][0]+1+sumf-f[j][1])
{
g[x][1]=(g[x][1]+mirmi(rec[j],mo-2)%mog[j][0]%mo)%mo;
}
}
}
if(f[x][0]>f[x][1]) rec[x]=g[x][0];
else
if(f[x][0]<f[x][1]) rec[x]=g[x][1];
else rec[x]=g[x][0]+g[x][1];
}
int main()
{
scanf("%lld%lld",&t,&p);
while(t--)
{
tot=0;
memset(last,0,sizeof(last));
memset(next,0,sizeof(next));
scanf("%lld",&n);
for(long long i=1;i<=n-1;i++)
{
long long x,y;
scanf("%lld%lld",&x,&y);
bj(x,y);
bj(y,x);
}
dg(1,0);
printf("%lld ",max(f[1][0],f[1][1]));
if(p==2) printf("%lld",rec[1]%mo);
cout<<endl;
}
}
```
【NOIP2016提高A组集训第13场11.11】最大匹配的更多相关文章
- 【JZOJ4887】【NOIP2016提高A组集训第13场11.11】最大匹配
题目描述 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存 ...
- 【JZOJ4886】【NOIP2016提高A组集训第13场11.11】字符串
题目描述 某日mhy12345在教同学们写helloworld,要求同学们用程序输出一个给定长度的字符串,然而发现有些人输出了一些"危险"的东西,所以mhy12345想知道对于任意 ...
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...
- JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线
JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...
- 【JZOJ4824】【NOIP2016提高A组集训第1场10.29】配对游戏
题目描述 流行的跳棋游戏是在一个有m*n个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数 ...
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...
- 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...
- 【JZOJ4833】【NOIP2016提高A组集训第3场10.31】Mahjong
题目描述 解法 搜索. 代码 #include<stdio.h> #include<iostream> #include<string.h> #include< ...
- 【NOIP2016提高A组集训第14场11.12】随机游走
题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...
随机推荐
- 什么是token?你是怎么理解token?
1.Token的引入: Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生. 2. ...
- ca认证(https)
证书签名过程: 1.网页服务器生成证书请求文件: 2.认证中心确认申请者的身份真实性: 3.认证中心使用根证书的私钥加密证书请求文件,生成证书: 4.把证书传给申请者. 一.实验环境 node1 19 ...
- [ASP.NET] 解决点击控件下载文件没有响应的问题
下载文件的方法是使用http响应输出流来实现的,使用到了response.write() 导致下载文件时点击控件出错,没有响应,也获取不了文件 是因为在母版页使用了updatepanel,因此回传时发 ...
- python 并发编程 多进程 生产者消费者模型总结
生产者消费者模型总结 生产者消费者模型什么时候用? 1.程序中有两类角色 一类负责生产数据(生产者) 一类负责处理数据(消费者) 2.引入生产者消费者模型为了解决的问题是 平衡生产者与消费者之间的速度 ...
- MySQL出现 Access denied for user 'root'@'localhost' (using password:YES) 解决办法
1.先停止MySQL服务,然后在MySQL安装目录(我的是C:\Program Files (x86)\MySQL\MySQL Server 5.1)找到my.ini文件,在最后一行添加skip-gr ...
- seata demo
0. 介绍 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案.Fes ...
- 父进程pid和子进程pid的大小关系
如果进程ID最大值没有达到系统进程数的上限,子进程比父进程ID大.但是如果进程ID达到上限,系统会分配之前分配但是已经退出的进程ID给新进程,这样有可能出现子进程ID比父进程小.
- JavaSE--关键字
关键字 1.static 属于成员修饰符,被静态修饰符修饰的成员要使用类名直接调用,该成员优先于对象存在,属于类且被所有实例化对象共享,静态成员随着类的加载而加载. 访问权限:静态成员优先于对象加载致 ...
- JS计算两个经纬度的距离
var mapNumberUtil = {}; /** * 计算两个经纬度的距离(千米) */mapNumberUtil.getDistance = function(lat1, lng1, lat2 ...
- 【检测工具】keepalived安装及配置
一.keepalived安装 keepalived是一个检测服务器状态的脚本,在高可用机制上经常可以看到它的身影. 在Linux中安装keepalived: 1.在网上直接下载相应的压缩包,推荐链接 ...