51nod 1673 树有几多愁
lyk有一棵树,它想给这棵树重标号。
第一行一个数n(1<=n<=100000)。
接下来n-1行,每行两个数ai,bi(1<=ai,bi<=n),表示存在一条边连接这两个点。
一行表示答案
5
1 2
2 4
2 3
3 5
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
struct Node
{
int next,to;
}edge[],edge2[];
int head[],num,num2,head2[],dep[],in[],b[],cnt,tot,n,l[],sz[],s[];
double f[<<];
lol g[<<],Mod=1e9+,w[],sum;
void add(int u,int v)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
}
void add2(int u,int v)
{
num2++;
edge2[num2].next=head2[u];
head2[u]=num2;
edge2[num2].to=v;
}
void dfs(int x,int pa,int tp)
{int i;
dep[x]=dep[pa]+;
if (in[x]!=)
{
b[++cnt]=x;w[cnt]=dep[x]-dep[tp];
if (tp!=x)
add2(tp,x);
tp=x;
}
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v!=pa) dfs(v,x,tp);
}
}
int main()
{int i,u,v,j,k;
cin>>n;
for (i=;i<=n-;i++)
{
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
in[u]++;in[v]++;
}
in[]=-;
dfs(,,);
for (i=;i<=n;i++)
if (in[i]==)
l[++tot]=i,sz[i]=;
for (i=cnt;i>=;i--)
{
for (j=head2[b[i]];j;j=edge2[j].next)
{
int v=edge2[j].to;
sz[b[i]]+=sz[v];
}
}
f[]=g[]=;
for (i=;i<(<<tot)-;i++)
{
for (j=;j<=cnt;j++)
s[b[j]]=;
for (j=;j<=tot;j++)
if (i&(<<j-))
s[l[j]]=;
lol id=;
for (j=cnt;j>=;j--)
{
for (k=head2[b[j]];k;k=edge2[k].next)
{
int v=edge2[k].to;
s[b[j]]+=s[v];
}
if (s[b[j]]==sz[b[j]]) id+=w[j];
}
double as=f[i]*id;
for (j=;j<=tot;j++)
if ((i&(<<j-))==&&as>f[i|(<<j-)])
f[i|(<<j-)]=as,g[i|(<<j-)]=g[i]*id%Mod;
}
cout<<g[(<<tot)-];
}
51nod 1673 树有几多愁的更多相关文章
- 51nod 1673 树有几多愁——虚树+状压DP
		
题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1673 建一个虚树. 一种贪心的想法是把较小的值填到叶子上,这样一个小值限制到的 ...
 - 51nod 1673 树有几多愁(链表维护树形DP+状压DP)
		
题意 lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输出 ...
 - [51nod1673]树有几多愁
		
lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输出最大烦 ...
 - 刷题总结——树有几多愁(51nod1673 虚树+状压dp+贪心)
		
题目: lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输 ...
 - 51nod1673 树有几多愁 - 贪心策略 + 虚树 + 状压dp
		
传送门 题目大意: 给一颗重新编号,叶子节点的值定义为他到根节点编号的最小值,求所有叶子节点值的乘积的最大值. 题目分析: 为什么我觉得这道题最难的是贪心啊..首先要想到 在一条链上,深度大的编号要小 ...
 - 题解  [51nod1673] 树有几多愁
		
题面 解析 这题思路挺秒啊. 本麻瓜终于找了道好题了(还成功把ztlztl大仙拖下水了) 看到叶子节点数<=20就应该是状压啊. 然而DP要怎么写啊? 首先,考虑到编号肯定是从下往上一次增大的, ...
 - 51nod 1353 树 | 树形DP经典题!
		
51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...
 - 51nod 1462 树据结构 | 树链剖分 矩阵乘法
		
题目链接 51nod 1462 题目描述 给一颗以1为根的树. 每个点有两个权值:vi, ti,一开始全部是零. Q次操作: 读入o, u, d o = 1 对u到根上所有点的vi += d o = ...
 - 51nod 1812 树的双直径 题解【树形DP】【贪心】
		
老了-稍微麻烦一点的树形DP都想不到了. 题目描述 给定一棵树,边权是整数 \(c_i\) ,找出两条不相交的链(没有公共点),使得链长的乘积最大(链长定义为这条链上所有边的权值之和,如果这条链只有 ...
 
随机推荐
- org.hibernate.hibernate.connection.release_mode
			
org.hibernate.connection包的主要封装了通过JDBC来连接数据库的操作,用户可以以数据源的方式,或者通过特定数据库驱动的方式,甚至是自己定义连接类的方式来完成数据库的连接操作,包 ...
 - Java 后端微信小程序支付demo (网上说的坑里面基本上都有)
			
Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...
 - WebAPI 跨域解决方案.
			
先下载支持跨域的.dll,然后using System.Web.Http.Cors. 我把webapi解决方案部署到IIS上了.测试过后可以解决跨域. 方案一(用了*号,这样有安全隐患.): 直接在w ...
 - C语言Linix服务器网络爬虫项目(一)项目初衷和网络爬虫概述
			
一.项目初衷和爬虫概述 1.项目初衷 本人的大学毕设就是linux上用c写的一个爬虫,现在我想把它完善起来,让他像一个企业级别的项目.为了重复发明轮子来学习轮子的原理,我们不使用第三方框架(这里是说的 ...
 - 进军ABP第一天:ABP理论知识
			
1.2.3 领域层领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现. ( 实体(Entity ) 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表. ( 仓储(Repo ...
 - MongoDb进阶实践之三 MongoDB查询命令详述
			
一.引言 上一篇文章我们已经介绍了MongoDB数据库的最基本操作,包括数据库的创建.使用和删除数据库,文档的操作也涉及到了文档的创建.删除.更新和查询,当然也包括集合的创建.重命 ...
 - js解决IE8不支持html5,css3的问题(respond.js 的使用注意)
			
IE8.0及以下不支持html5,css3的解析.目前为止IE8以下的版本使用率在10%左右,网站还是有必要兼容的. 1,在你的所有css最后判断引入两个js文件. html5.js 是用来让ie8 ...
 - 自动化服务部署(一):Linux下安装JDK
			
自动化测试的主要目的是为了执行回归测试.当然,为了模拟真实的用户操作,一般都是在UAT或者生产环境进行回归测试. 为了尽量避免内网和外网解析对测试结果的影响,将自动化测试服务部署在外网的服务器是比较好 ...
 - python 中 reduce 函数的使用
			
reduce()函数也是Python内置的一个高阶函数. reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接 ...
 - python入门(14)定义函数和接收返回值
			
定义函数: 定义一个求绝对值的my_abs函数为例: def my_abs(x): if x >= 0: return x else: return -x 如果没有return语句,函数执行完毕 ...