【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很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...
随机推荐
- 使用canvas实现对图片的批量打码
最近有个需求,利用h5的canvas对图片一些涉及个人隐私的地方进行打码再上传,而且最好能实现批量打码.意思是在一张图片上对哪些地方做了打码,后续的所有图片都在同样的地方也可以自动打上码,不用人工一张 ...
- 【VS开发】ActiveX开发注意事项
[VS开发]ActiveX开发注意事项 标签:[VS开发] 注意:必须在工程的app文件的InitInstance()中加入如下代码,否则动态创建控件不会成功: AfxEnableControlCon ...
- ocelot集成consul服务发现
首先下载consul 点击这里下载 转到解压文件夹目录输入cmd命令 consul agent -dev (有时候会卡住按一下方向键上) 在浏览器中输入http://localhost:8500/u ...
- 用SelectSingleNode()方法查找xml节点一直返回null
代码使用如下 XmlNode root = xmlDoc.SelectSingleNode("Project"); 返回的root一直是null 查了xml文件中确实是有Proje ...
- mysql的高可用之rounter
参考: https://segmentfault.com/a/1190000011970688
- 【Linux 网络编程】MTU(Maximum Transmission Uint)
(1)以太网和IEEE802.3对数据帧的长度都是有限制的,其最大分别是1500和1492字节,成为MTU. (2)如果IP层有一个数据要传输,而且数据的长度比链路层的MTU要大,那么IP层就要进行分 ...
- Laravel 程序优化
转载: Laravel 程序优化 说明 作为优秀的开发者,在日常编码中,应积极培养书写高执行效率代码的意识.不过项目运行效率是一个系统性工程,不应该只停留在代码层面上,有时更应该考虑整个项目架构,包括 ...
- PythonError解决方案
# Pip Error pip install * error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visua ...
- 解决 SQLPlus无法登陆oracle,PLSql可以登陆,报错ORA-12560
使用Oracle 11g 64位服务器,安装64位.32位客户端,出现SQLPlus无法连接数据库,PLSql可以连接问题. 网上查了很多,都不能解决问题,在下面提供一种. 环境变量 右击计算机属性- ...
- Python类函数调用:missing 1 required positional argument
在Python中,应该先对类进行实例化,然后在应用类.注意,实例化的过程是应该加括号的.