问题描述

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. Activity源码简要分析总结

    Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...

  2. 操作系统开发系列—13.i.进程调度 ●

    上面的三个进程都是延迟相同的时间,让我们修改一下,尝试让它们延迟不同的时间. void TestA() { int i = 0; while (1) { disp_str("A." ...

  3. android post带数据请求方式,传递的数据格式包括json和map

    如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...

  4. Provisioning Profile文件在哪找?

    ~/Library/MobileDevice/Provisioning Profiles

  5. 【读书笔记】iOS-ARC-环境下如何查看引用计数的变化

    一,新建立一个工程,用于测试引用计数的变化. 二,找到如下路径Build Phases---->Compile Sources---->AppDelegate.m 三,选中AppDeleg ...

  6. ubuntu下安装Apache + PHP + Mysql

    首次登录 在本地设备中打开终端,执行ssh命令,登陆服务器. ssh root@139.196.222.22 输入根用户密码,按回车确认. 升级软件 为了确保操作系统中的默认的软件安装了最新的更新和补 ...

  7. iOS 9 使用HTTP的方法

    问题 在ios 9中使用HTTP请求,Xcode就会抛出下面的Exception: App Transport Security has blocked a cleartext HTTP (http: ...

  8. win7---远程桌面相关的服务

    如果对方连接不到你,请将服务设置为自动,并重启电脑.

  9. 使用 AngularJS 开发一个大规模的单页应用(SPA)

      本文的目标是基于单页面应用程序开发出拥有数百页的内容,包括认证,授权,会话状态等功能,可以支持上千个用户的企业级应用. 下载源代码 介绍 (SPA)这样一个名字里面蕴含着什么呢? 如果你是经典的S ...

  10. Percona XtraBackup User Manual 阅读笔记

    XtraBackup XtraBackup 2 安装XtraBackup 2.1 安装XtraBackup binary版本 2.1.1 yum的安装方法: 2.1.2 直接下载rpm包安装 3 Xt ...