NOIP模拟赛 最大匹配
问题描述
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模拟赛 最大匹配的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- SharePoint 判断用户是否在字段"人员和组"里面
两个自己平时写的方法,记录下来,方便以后查找使用: 1.判断用户是否在字段人员和组里面: public static bool IsUserInFiled(int UserID, string Lis ...
- Swift tour
输出函数: print(“hello world!") 无需引入函数库,无须使用“;”作为语句结尾,也无须写跟其它语言一样的main()函数,Swift中,全局区的代码就是程序入口.You ...
- 基于 LocalAuthentication 框架的指纹解锁
效果 想必大家对 iPhone 的指纹解锁功能已经相当的熟悉了.来看看效果吧! Local Authentication 概述 Local Authentication 框架提供了按照指定的安全策略请 ...
- Runnable,Thread实现多线程以及Runnable的同步资源共享
(一) 实现多线程有两种方式 (1) 继承Thread类,重写run()方法,如以下例子 class MyThread extends Thread{ public void run(){ // } ...
- MySQL两种表存储结构MyISAM和InnoDB的性能比较测试
转载 http://www.jb51.net/article/5620.htm MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1 ...
- JS实现悬浮移动窗口(悬浮广告)的特效
页面加载完成之后向页面插入窗口,之后向窗口插入关闭按钮,使用setInterval()函数触发moves()函数开始动画 js方法: 复制代码代码如下: <!DOCTYPE HTML PUB ...
- IntelliJ IDEA 使用总结[zz]
本文转自:http://cowboy-bebop.iteye.com/blog/1035550,仅做稍微整理,转载请注明出处. 1. IDEA内存优化 因机器本身的配置而配置: \IntelliJ I ...
- Strange Problem O(∩_∩)O~
题目描述: 古代某个狱卒某天闲着没事想和两个罪犯玩个游戏,他找了个国际象棋盘,每个格子放上一个硬币,硬币长得都一样,正反都是狱卒自己决定. 之后他只让A罪犯观看棋盘,并随便指一个硬币告诉A罪犯,只要B ...
- 使用jqgrid的C#/asp.net mvc开发者的福音 jqgrid-asp.net-mvc
你是否使用jqgrid? 你是否想在C#/asp.net mvc中使用jqgrid? 那你很可能曾经为了分析jqgrid的request url用fiddler忙活了2个小时.(如果你要使用jqgri ...
- SSIS技巧--优化数据流缓存
问题 我们经常遇到一种情况,在SSMS中运行很慢的一个查询,当把查询转化成从源到目的数据库的SSIS数据流以后,需要花费几倍的时间!源和数据源都没有任何软硬件瓶颈,并且没有大量的格式转换.之前看了很多 ...