http://www.lydsy.com/JudgeOnline/problem.php?id=1063

题意:给你一棵树,也有可能是不连通的,把树分成几个链,求每个点到根经过的最大链数最小,而且要输出方案数。

思路:考虑dp,f[i][j]代表第i个节点,最大链数是j,那么有

f[i][j][0]代表已经向子树连接了0个链

f[i][j][1]代表已经向子树连接了1个链

f[i][j][2]代表已经向子树连接了2个链

这样转移就是

f1=f[pur][b][0]+f[pur][b][1]

f2=f[pur][b-1][0]+f[pur][b-1][1]+f[pur][b-1][2]

f[x][b][2]=f2*f[x][b][2]+f1*f[x][b][1]

f[x][b][1]=f1*f[x][b][0]+f2*f[x][b][1]

f[x][b][0]=f[x][b][0]*f2

pur代表x的儿子

 #include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
ll Mod;
int first[],next[],go[],tot;
int n,m,fa[];
ll f[][][];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<='') {t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int x,int y){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
}
void add(int x,int y){
insert(x,y);insert(y,x);
}
int find(int x){
if (fa[x]==x) return x;else return fa[x]=find(fa[x]);
}
ll get(ll x){
if (x%Mod!=) return x%Mod;
if (x!=) return Mod;
return ;
}
void dfs(int x,int b,int fa){
f[x][b][]=;
f[x][b][]=;
f[x][b][]=;
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (pur==fa) continue;
dfs(pur,b,x);
ll f1=(f[pur][b][]+f[pur][b][]);
ll f2;
if (b) f2=f[pur][b-][]+f[pur][b-][]+f[pur][b-][];else f2=;
f[x][b][]=get(f2*f[x][b][]+f1*f[x][b][]);
f[x][b][]=get(f1*f[x][b][]+f2*f[x][b][]);
f[x][b][]=get(f[x][b][]*f2);
}
}
int main(){
n=read();m=read();Mod=read();
for (int i=;i<=n;i++) fa[i]=i;
for (int i=;i<=m;i++){
int x=read(),y=read();
add(x,y);
int p=find(x),q=find(y);
if (p!=q) fa[q]=p;
}
for (int i=;i<=n;i++)
if (find(i)!=find()){printf("-1\n-1\n");return ;}
for (int i=;;i++){
dfs(,i,);
if (f[][i][]+f[][i][]+f[][i][]){
printf("%d\n",i);
printf("%lld\n",((f[][i][]+f[][i][])%Mod+f[][i][])%Mod);
return ;
}
}
}

BZOJ 1063 道路设计NOI2008的更多相关文章

  1. [BZOJ]1063 道路设计(Noi2008)

    省选一试后的第一篇blog! Description Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代,公路成为这里主要的交通手段.Z国共有n座城市,一些城市之间由双向的公路所连接.非常神奇的是Z ...

  2. BZOJ 1063 道路设计(树形DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1063 题意:给出一个无环图( 也就是树,但是也有可能是森林),代表一个国家的城市.1是首 ...

  3. 【NOI题解】【bzoj题解】NOI2008 bzoj1063 道路设计

    @ACMLCZH学长出的毒瘤题T3.再也不是“善良”的出题人了. 题意:bzoj. 题解: 经典的树形DP题目,屡见不鲜了,然而我还是没有写出来. 这一类的题目有很多,例如这里的C题. 主要套路是把对 ...

  4. bzoj 1064【noi2008】假面舞会

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1064 给一个有向图染色,每个点的后继必须相同,问至少&至多有多少种染色方案 sol: ...

  5. 【BZOJ】1061: [Noi2008]志愿者招募

    题解 可能是世界上最裸的一个单纯形 (话说全幺模矩阵是啥我到现在都不知道) 假装我们已经看过了算导,或者xxx的论文,知道了单纯形是怎么实现的 扔一个blog走掉..https://www.cnblo ...

  6. 【BZOJ】1064: [Noi2008]假面舞会(判环+gcd+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 表示想到某一种情况就不敢写下去了.... 就是找环的gcd...好可怕.. 于是膜拜了题解.. ...

  7. 【BZOJ】1061: [Noi2008]志愿者招募(费用流+数学)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 好神的一题! 学会了一种建模方式: 当方程组内的任意变量都在其中两个方程出现且一正一负,可以建 ...

  8. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

  9. BZOJ1000-1099板刷计划+一句话题解 73/100

    1000-1009 1000A+B Problem 这个还要写??? 1001 狼抓兔子 平面图最小割转化为对偶图最短路 #include<bits/stdc++.h> #define i ...

随机推荐

  1. 智能卡安全机制比较系列(五) StarCOS

    StarCOS是捷德公司的推出的智能卡COS,和前面说过的几种COS不同的是,国内的用户对于StartCOS可以说非常熟悉,而且因为握奇.明华.天喻等公司的安全机制都基本上是脱胎于StarCOS,所以 ...

  2. Keil伪指令

    Keil伪指令 目录 Keil伪指令... 1.     ALTNAME. 2 2.     BIT. 2 3.     BSEG.. 2 4.     CODE. 2 5.     CSEG.. 2 ...

  3. Win8/8.1/10获得完整管理员权限的方法

    WIN+R,运行对话框中输入gpedit.msc,开启组策略,然后一步步地在“计算机配置”-“Windows 设置”-“安全设置”-“本地策略”-“安全选项”,找到右侧的“用户账户控制:以管理员批准模 ...

  4. 原型模式 - OK

    原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 简单说来原型模式就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节. 原型模式UML ...

  5. [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

    题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...

  6. debuggap,移动端调试新方式

    最近发现了一个移动端调试的新技能,这里简单描述一下基本情况. 移动端调试常遇到的问题 手机访问只能看到页面的展现,除此之外看不到任何其他信息 无法像调试PC页面那么方便的查看js.dom.networ ...

  7. c++之命名空间namespace

    1命名空间解决全局变量的冲突 main.h文件 #pragma once // data命名空间的名称 namespace data { ;//外部全局变量冲突 } main.cpp #include ...

  8. jps命令使用

    jps工具 jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前全部java进程pid的命令,简单有用,很适合在linux/un ...

  9. CentOS6.6修改主机名和网络信息

    1.修改主机名称 [root@centos ~]# vim /etc/sysconfig/network #打开文件,修改以下内容并保存 NETWORKING=yes #使用网络HOSTNAME=ce ...

  10. 配置linux中文

    1.~/.bash_profile文件添加一下内容并执行source  ~/.bash_profile export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK 2./etc ...