hungary
更正:模数1000000007
/*
最大匹配求p=1的情况能得30分
正解:树形DP,f[i][0/1]表示i节点向下连的那条边选或不选时的最大值
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 100010
#define mod 1000000007
#define ll long long
using namespace std;
ll T,P,n,head[maxn],num,f[maxn][],g[maxn][],L,R[maxn],l,r[maxn],son[maxn];
struct node
{
ll v,pre;
}e[maxn*];
ll init()
{
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Add(ll from,ll to)
{
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Clear()
{
num=;
memset(f,,sizeof(f));
memset(g,,sizeof(g));
memset(head,,sizeof(head));
}
void DP(ll now,ll from)
{
g[now][]=;
ll mx,sum;
for(int i=head[now];i;i=e[i].pre)
{
ll v=e[i].v;
if(v==from)continue;
DP(v,now);//x不连儿子 儿子们可连可不连
mx=max(f[v][],f[v][]);sum=;
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
g[now][]=g[now][]*sum%mod;
f[now][]+=mx;
}
//x连某个儿子 这个不选 其他的连或者不连
L=;l=;ll S=;
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)son[++S]=e[i].v;
R[S+]=;r[S+]=;
for(int i=S;i>=;i--)//预处理一个后缀和,R[i]表示i的后缀匹配数,r[i]为方案数
{
ll v=son[i];sum=;
mx=max(f[v][],f[v][]);
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
R[i]=R[i+]+mx;
r[i]=r[i+]*sum%mod;
}
for(int i=;i<=S;i++)//L是前缀和,不断累加
{
ll v=son[i];//枚举now连的是哪个儿子
mx=L+f[v][]+R[i+]+;
if(mx>f[now][])
{
f[now][]=mx;
g[now][]=l*g[v][]%mod*r[i+]%mod;
}
else if(mx==f[now][])
g[now][]=(g[now][]+l*g[v][]%mod*r[i+]%mod)%mod;
sum=;
mx=max(f[v][],f[v][]);
if(mx==f[v][])sum+=g[v][];
if(mx==f[v][])sum+=g[v][];
l=l*sum%mod;L+=mx;
}
}
int main()
{
freopen("hungary.in","r",stdin);
freopen("hungary.out","w",stdout);
T=init();P=init();
while(T--)
{
n=init();
ll u,v;Clear();
for(int i=;i<n;i++)
{
u=init();v=init();
Add(u,v);Add(v,u);
}
DP(,);ll sum,mx;
mx=max(f[][],f[][]);sum=;
if(mx==f[][])sum+=g[][],sum%=mod;
if(mx==f[][])sum+=g[][],sum%=mod;
if(P==)cout<<mx<<endl;
if(P==)cout<<mx<<" "<<sum<<endl;
}
return ;
}
hungary的更多相关文章
- codevs1022 覆盖[Hungary 二分图最大匹配]
codevs1022 覆盖 有一个N×M的单位方格中,其中有些方格是水塘,其他方格是陆地.如果要用1×2的矩阵区覆盖(覆盖过程不容许有任何部分重叠)这个陆地,那么最多可以覆盖多少陆地面积. 输入描述 ...
- graph | hungary
匈牙利算法,求二分图最大匹配. 若P是图G中一条连通两个未匹配顶点的路径,并且属于M的边和不属于M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径.(M为一个匹配) 由增广路 ...
- Hungary(匈牙利算法)——二分图最大匹配
在复习匈牙利算法的时候,发现这么一篇介绍匈牙利算法的文章,非常通俗易懂,所以就借鉴过来了. 复杂度:邻接矩阵:O(v^3)邻接表:O(V*E) 附上链接:趣写算法系列之--匈牙利算法 下面就附上代码吧 ...
- BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]
3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...
- BZOJ 2034: [2009国家集训队]最大收益 [贪心优化 Hungary]
2034: [2009国家集训队]最大收益 题意:\(n \le 5000\)个区间\(l,r\le 10^8\),每个区间可以选一个点得到val[i]的价值,每个点最多选1次,求最大价值 线段树优化 ...
- POJ1274 The Perfect Stall[二分图最大匹配 Hungary]【学习笔记】
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23911 Accepted: 106 ...
- 「日常温习」Hungary算法解决二分图相关问题
前言 二分图的重点在于建模.以下的题目大家可以清晰的看出来这一点.代码相似度很高,但是思路基本上是各不相同. 题目 HDU 1179 Ollivanders: Makers of Fine Wands ...
- HDU 2063.过山车-Hungary(匈牙利算法)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Hungary Algorithm国外板子
Codeforces 1107一题除了dp做法还有二分带权匹配O(n^3)做法,国外网友的板子时间非常优秀,但矩阵设定的事情并不是很懂-- //Codeforces 1107F const int m ...
随机推荐
- linux 下用户管理
linux 下用户管理 一.用户的分类 1.超级用户:root UID=0 2.系统用户:不需要登录系统,对应用程序服务,主要维护系统的正常运行:UID = 1 ~ 499(RHEL7 = 1 ~ 9 ...
- python urllib2使用心得
python urllib2使用心得 1.http GET请求 过程:获取返回结果,关闭连接,打印结果 f = urllib2.urlopen(req, timeout=10) the_page = ...
- 浏览器查看cookie
今天总结下,教你怎样查看一些浏览器的Cookie,比如IE.Firefox.Chrome的Cookies等.下面分块介绍,以后会关注一些没有讲到的浏览器获取Cookie的方法. 1.Firefox浏览 ...
- Hbase Shell常用命令
hbase shell常用的操作命令有create,describe,disable,drop,list,scan,put,get,delete,deleteall,count,status等,通过h ...
- mysql 导入大sql文件时 max_allowed_packet 选项的设置
mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...
- webform添加到webapi的支持
1.添加引用 添加对 System.Net.Http , System.Net.Http.Formatting , System.Web.Http , System.Web.Http.Common , ...
- myBatis 实现用户表增删查改操作<方法2 加入接口>(最终版)
这2种方法的区别:1.添加接口 2.运用接口来实现 其他的都一样 添加接口 //接口的名字和xml的名字一样,这样xml中的namespace就不用改 public interface UserMap ...
- @suppressWarnings解释
J2SE 提供的最后一个批注是 @SuppressWarnings.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默. 一点背景:J2SE 5.0 为 Java 语言增加 ...
- JNI的某些数组和字符串类型转换
JNICC++C#Windows jbytearray转c++byte数组 jbyte * arrayBody = env->GetByteArrayElements(data,0); jsiz ...
- linux kill信号列表
linux kill信号列表 $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) ...