问题描述

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. SharePoint 2013 修改表单认证登录页面

    前 言 之前的博客我们介绍了如何为SharePoint配置表单登陆,但是,登陆页面是丑.很丑.非常丑.特别非常丑!我们现在就介绍一下如何定制SharePoint表单登陆页面! SharePoint 表 ...

  2. Ubuntu下安装Naginx, PHP5(及PHP-FPM),MySQL

    一:安装前做个简单的说明 二:安装MySQL 三:安装Nginx 四:安装PHP5 五:配置 nginx,以下是我本机的配置文件. 六:让MySQL支持PHP5 七:配置PHP-FPM 八:在/etc ...

  3. 使用ContentProvider访问其他应用的SharedPreferences数据

    @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs ...

  4. OC中的特有语法

    一. 分类-Category 1. 基本用途 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 l 继承 l 分类(Category) 2. 格式 分类的声明 @interface 类名  ...

  5. IntelliJ IDEA 使用总结[zz]

    本文转自:http://cowboy-bebop.iteye.com/blog/1035550,仅做稍微整理,转载请注明出处. 1. IDEA内存优化 因机器本身的配置而配置: \IntelliJ I ...

  6. (视频) 《快速创建网站》 3.2 WordPress多站点及Azure在线代码编辑器 - 扔掉你的ftp工具吧,修改代码全部云端搞定

    本文是<快速创建网站>系列的第6篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...

  7. XML 学习介绍 收藏

    XML学习总结(一)——XML介绍 一.XML概念 Extensible Markup Language,翻译过来为可扩展标记语言.Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发 ...

  8. Html5拖拽复制

    拖拽是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖拽是标准的一部分,任何元素都能够拖拽. Html5拖拽非常常见的一个功能,但是大部分拖拽的案例都是一个剪切的过程, 项目中需 ...

  9. jq+css+html简单实现导航下拉菜单

    相信导航栏下拉菜单是web开发最常见的一个item了.这里就不做介绍了,直接上code. Html部分 <div class="_nav"> <ul id=&qu ...

  10. IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比

    获取表的标识值,有3种比较常见的用法 IDENT_CURRENT ,@@identity,SCOPE_IDENTITY(),有啥不一样呢? 3个关键字在联机手册中的解释   IDENT_CURRENT ...