问题描述

mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边。
    图的“匹配”是指这个图的一个边集,里面的边两两不存在公共端点。
匹配的大小是指该匹配有多少条边。
    二分图匹配我们可以通过匈牙利算法得以在O(VE)时间复杂度内解决。
mhy12345觉得单纯的二分图匹配算法毫无难度,因此提出新的问题:
现在给你一个N个点N-1条边的连通图,希望你能够求出这个图的最大匹配以及最大匹配的数量。
    两个匹配不同当且仅当存在一条边在第一个匹配中存在而在第二个匹配中不存在。

输入格式

第一行两个数T,P,其中T表示数据组数。
接下来每组数据第一行一个数N
接下来N-1行每行两个数分别表示一条边。

输出格式

对于每组数据,输出一行:
若p=1,则一行一个数输出图的最大匹配
若p=2,则一行两个数输出图的最大匹配以及最大匹配数量。

输入输出样例一

hungary.in

hungary.out

1 1

2

1 2

1

题解:

问题可以看成层与层间、父亲和儿子间选和不选的两种情况

选一个节点可以看作选下图中的块:

约定如下:

f[i],选中编号为i的节点的最大匹配;

F[i],选中编号为i的节点的最大匹配的方案数;

g[i],不选编号为i的节点的最大匹配;

G[i],不选编号为i的节点的最大匹配的方案数;

h[i],编号为i节点的最大匹配;

H[i],编号为i节点的最大匹配的方案数;

于是初始的动规方程如下:

g[i]=g[i]+h[son]

G[i]=G[i]*H[son]

f[i]=max(f[i],(∑h[son,son])-h[son]+g[son])

F[i]=(∏H[son])/h[son]*G[son]

#include<stdio.h>
#include<string.h>
#define buf 100001
#define mo 1000000007
typedef long long ll;
inline void S(int &x){
x=;int c=getchar(),f=;
for(;c<||c>;c=getchar())
if(!(c^))
f=-;
for(;c>&&c<;c=getchar())
x=(x<<)+(x<<)+c-;
x*=f;
}
int n,fst[buf],nxt[buf<<],v[buf<<],tot;
ll g[buf],G[buf],f[buf],F[buf],h[buf],H[buf];
inline void link(int a,int b){
v[++tot]=b,
nxt[tot]=fst[a],
fst[a]=tot,
v[++tot]=a,
nxt[tot]=fst[b],
fst[b]=tot;
}
ll P(ll a,ll b){
ll c=;
for(;b;b>>=){
if(b&)
c=c*a%mo;
a=a*a%mo;
}
return c;
}
ll N(ll a){
return P(a,mo-);
}
void D(int x,int fa){
G[x]=;
g[x]=f[x]=F[x]=h[x]=H[x]=;
ll mul=,sum=;
for(int j=fst[x];j;j=nxt[j])
if(v[j]^fa)
D(v[j],x),
g[x]+=h[v[j]],
G[x]=G[x]*H[v[j]]%mo,
sum+=h[v[j]],
mul=mul*H[v[j]]%mo;
for(int j=fst[x];j;j=nxt[j])
if(v[j]^fa)
if(f[x]<sum-h[v[j]]+g[v[j]]+)
f[x]=sum-h[v[j]]+g[v[j]]+,
F[x]=mul*N(H[v[j]])%mo*G[v[j]]%mo;
else
if(!(f[x]^(sum-h[v[j]]+g[v[j]]+)))
F[x]=(F[x]+mul*N(H[v[j]])%mo*G[v[j]]%mo)%mo;
if(f[x]>g[x])
h[x]=f[x],
H[x]=F[x];
else
if(f[x]<g[x])
h[x]=g[x],
H[x]=G[x];
else
h[x]=f[x],
H[x]=(F[x]+G[x])%mo;
}
int main(){
int T,p;
freopen("hungary.in","r",stdin),
freopen("hungary.out","w",stdout);
S(T),S(p);
while(T--){
tot=;
memset(fst,,sizeof(fst));
S(n);
for(int i=,x,y;i<n;i++)
S(x),
S(y),
link(x,y);
D(,);
if(p&)
printf("%I64d\n",h[]);
else
printf("%I64d %I64d\n",h[],H[]);
}
fclose(stdin),
fclose(stdout);
}

NOIP模拟赛 最大匹配的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. cacti监控windows服务器

    参考文献: 通​过​C​a​c​t​i​监​控​w​i​n​d​o​w​s​资​源 前提条件 一.已安装好Cacti:ubuntu下cacti安装配置 二.准备好以下安装文件: Cacti_SNMP_ ...

  2. pod install 和 pod update的区别

    pod install 和 pod update的区别 pod install(下载并安装pod) 1,当pod file文件中有“增加pod,删除pod,修改pod”的操作之后使用. 2,pod i ...

  3. 【Andorid】短视频拍摄SDK——Vitamio Recorder 2.0 发布(支持ffmpeg命令行)

    简介 VCamera SDK Android 版(短视频拍摄SDK)是炫一下(北京)科技有限公司推出的软件开发工具包,为Android开发者提供简单.快捷的接口,帮助开发者实现Android平台上的短 ...

  4. mysql中数据类型的取值范围

    mysql整型bigint.int.mediumint.smallint 和 tinyint的语法介绍,如下: 1.bigint 从 -2^63 (-9223372036854775808) 到 2^ ...

  5. AngularJS 指令

    AngularJS 指令 AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. ng-app 指令 ng-app 指令定义了 AngularJS 应用程序的 根元素. ng-app 指 ...

  6. Java集合框架的接口和类层次关系结构图

    Collection和Collections的区别 首先要说的是,"Collection" 和 "Collections"是两个不同的概念: 如下图所示,&qu ...

  7. ORA-12154 & TNS-03505 案例分享

    下面介绍一个工作中遇到的案例场景,应用服务器连接数据库出现"ORA-12154: TNS: 无法解析指定的连接标识符".一般情况下ORA-12541错误是很容易排除的,但是这次遇到 ...

  8. 自动kill慢查询

    在生产环境中,DB服务器经常会被并发的慢查询压挂,因此事前进行sql审核避免烂SQL很重要.万一不小心慢sql还是跑到线上,并且并发还不小,这是dba肯定会收到告警.dba上线处理第一时间是定位并ki ...

  9. 使用国内 maven 镜像 代替国外 mirror

    使用maven的都知道国外的maven下载一个是比较慢,一个是因为被墙,一些jar包无法下载,非常老火. 比如出现类似下面的错误: Unknown host repo.maven.apache.org ...

  10. Drupal7网站+IIS7.0+PHP+MySql

    .服务器系统环境 Windows Server R2 Enterprise 64位操作系统 .所需软件 IIS7 PHPManager http://phpmanager.codeplex.com/r ...