【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很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...
随机推荐
- asp.net mvc中用 log4net记录日志到数据库中
1.log4net官网配置相关,创建数据库 http://logging.apache.org/log4net/release/config-examples.html CREATE TABLE [d ...
- django设置mysql为数据库笔记
1,guest/settings.py中加上 import pymysql pymysql.install_as_MySQLdb() 安装好pymysql 2,guest/settings.py的DA ...
- redis学习(三)
如何保障reids的数据安全和性能? 一.持久化选项 1.快照snapshotting 它可以将存在于某一时刻的所有数据都写入硬盘里面. 配置选项示例: save 60 1000 注:从最近一次创 ...
- Win10无法安装.net framework 3.5出错提示无法安装以下功能该怎么办?
在Windows操作系统中,.NET Framewor对今天应用程序的成功提供了的安全解决方案,它能强化两个安全模型间的平衡.在提供对资源的访问,以便以完成有用的工作,对应用程序的安全性作细致的控制以 ...
- show slave status参数详解
root@localhost (none)>show slave status\G *************************** 1. row ******************** ...
- 修改Docker0网桥默认网段
Docker--修改Docker0网桥默认网段 修改文件 /etc/docker/daemon.json 添加内容 "bip": "ip/netmask" [ ...
- 头大!RabbitMQ 和 Kafka 到底怎么选?
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措. 对于RabbitMQ和Kafka,到底应该选哪个? Rabb ...
- 查找元素在list中的位置以及折半查询
问题 查找某个值在list中的位置 解决思路 能够用折半查询的方法解决此问题. 解决(Python) #! /usr/bin/env python #coding:utf-8 #折半查找某个元素在li ...
- mysql导入导出数据,备份,恢复数据
MYSQL 实现导入数据 .备份和恢复数据库 1.使用msql命令导入数据 # mysql -uroot -p 需要选择一个数据库 < runoob.sql #mysql -u username ...
- 本地安装node.js模块
一.需求 单位电脑不让上网,但是需要用到一个node.js模块,elasticdump. 二.解决 1.自己电脑上下载模块: npm install elasticdump -g 注意:必须要加 -g ...