BNUOJ 52305 Around the World 树形dp
题目链接:
https://www.bnuoj.com/v3/problem_show.php?pid=52305
Around the World
Time Limit: 20000msMemory Limit: 1048576KB
题意
给你一颗树,相邻两点间有2c条边,问以1为起点和终点的欧拉回路有多少种。
题解
树形dp
兄弟之间考虑可重集的排序,父子之间则考虑下插板法。
dp[u]表示以u为根的子树能跑的所有欧拉回路。
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=1e5+10;
const int maxm=2e6+100;
const int mod=1e9+7;
VPII G[maxn];
int n;
LL dp[maxn];
int cntv[maxn];
LL inv[maxm],invfac[maxm],fac[maxm];
LL get_C(int n,int m){
    return fac[n]*invfac[m]%mod*invfac[n-m]%mod;
}
void dfs(int u,int fa){
    LL &res=dp[u]=1;
    cntv[u]=0;
    rep(i,0,G[u].sz()){
        int v=G[u][i].X,c=G[u][i].Y;
        if(v==fa) continue;
        dfs(v,u);
        cntv[u]+=c;
        //儿子的兄弟间的可重集排列
        res=res*invfac[c]%mod;
        //上下要插板
        res=res*get_C(cntv[v]+c-1,c-1)%mod;
        //内部阶乘
        res=res*fac[2*c]%mod;
        //分步乘法
        res=res*dp[v]%mod;
    }
    //儿子的兄弟间的可重集排列
    res=res*fac[cntv[u]]%mod;
}
void pre(){
    fac[0]=fac[1]=1;
    invfac[0]=invfac[1]=1;
    inv[1]=1;
    rep(i,2,maxm){
        fac[i]=fac[i-1]*i%mod;
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
        invfac[i]=invfac[i-1]*inv[i]%mod;
    }
}
int main() {
    pre();
    scf("%d",&n);
    for(int i=0;i<n-1;i++){
        int u,v,c;
        scf("%d%d%d",&u,&v,&c);
        G[u].pb(mkp(v,c));
        G[v].pb(mkp(u,c));
    }
    dfs(1,-1);
    prf("%lld\n",dp[1]);
    return 0;
}
//end-----------------------------------------------------------------------BNUOJ 52305 Around the World 树形dp的更多相关文章
- BNUOJ-26482 Juice 树形DP
		题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26482 题意:给一颗树,根节点为送电站,可以无穷送电,其它节点为house,电量达到pi时 ... 
- poj3417 LCA + 树形dp
		Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ... 
- COGS 2532. [HZOI 2016]树之美 树形dp
		可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ... 
- 【BZOJ-4726】Sabota?       树形DP
		4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ... 
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
		题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ... 
- 树形DP
		切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ... 
- BZOJ 2286 消耗战 (虚树+树形DP)
		给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ... 
- POJ2342 树形dp
		原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ... 
- hdu1561 The more, The Better (树形dp+背包)
		题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ... 
随机推荐
- 在windows上安装不同(两个)版本的Mysql数据库
			1.起因: 需要导入一个sql文件,发现死活导不进去.当执行到这一句时,就有问题.经过一番搜索,原来是我的数据库版本(原先Mysql版本5.5)低了,而支持该语句的版本应该是至少要5.7.那我索性就去 ... 
- Taming the asynchronous beast with ES7
			https://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html We have a problem with promises ... 
- 20155229 2016-2017-2 《Java程序设计》第九周学习总结
			20155229 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC(Java DataBaseConnectivity)即java数据库连接 ... 
- PostreSQL崩溃试验全记录
			磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackg ... 
- 2 timeit模块,python中数据结构
			1.timeit模块:代码事件测量模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', ti ... 
- Asp.net中使用缓存(cache)
			做了一个时间优化的项目,目的就是缩短程序过程中的时间花费,最后发现了asp.net和asp.net core 中都有缓存工具来进行缓存,以加快访问速度. 找了官方demo来进行分析: ObjectCa ... 
- [APIO2018] Duathlon 铁人两项 圆方树,DP
			[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ... 
- jzoj5341 捕老鼠
			Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕老鼠. 猫虽然擅长捕老鼠,但是老鼠们太健美了,身手敏捷,于是猫想 ... 
- express的web server设置流程
			对于express的设置,一直是拿来就用,只知其然,今天查了一下文档,记录详细过程如下. 1.实现基本常用功能需要的模块path 用来处理路径字符串拼接,设置模板路径和静态资源路径时使用cookie- ... 
- Altium 中异形焊盘异形封装的创建图文教程
			Altium 中异形焊盘异形封装的创建图文教程 一般不规则的焊盘被称为异型焊盘,典型的有金手指.大型的器件焊盘或者板子上需要添加特殊形状的铜箔(可以制作一个特殊封装代替). 如图27所示,此处我们以一 ... 
