1063: [Noi2008]道路设计

Time Limit: 20 Sec   Memory Limit: 162 MB
Submit: 1147   Solved: 619
[ Submit][ Status][ Discuss]

Description

  Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代公路成为这里主要的交通手段。Z国共有n座城市,一
些城市之间由双向的公路所连接。非常神奇的是Z国的每个城市所处的经度都不相同,并且最多只和一个位于它东
边的城市直接通过公路相连。Z国的首都是Z国政治经济文化旅游的中心,每天都有成千上万的人从Z国的其他城市
涌向首都。为了使Z国的交通更加便利顺畅,小Z决定在Z国的公路系统中确定若干条规划路线,将其中的公路全部
改建为铁路。我们定义每条规划路线为一个长度大于1的城市序列,每个城市在该序列中最多出现一次,序列中相
邻的城市之间由公路直接相连(待改建为铁路)。并且,每个城市最多只能出现在一条规划路线中,也就是说,任意
两条规划路线不能有公共部分。当然在一般情况下是不可能将所有的公路修建为铁路的,因此从有些城市出发去往
首都依然需要通过乘坐长途汽车,而长途汽车只往返于公路连接的相邻的城市之间,因此从某个城市出发可能需要
不断地换乘长途汽车和火车才能到达首都。我们定义一个城市的“不便利值”为从它出发到首都需要乘坐的长途汽
车的次数,而Z国的交通系统的“不便利值”为所有城市的不便利值的最大值,很明显首都的“不便利值”为0。小
Z想知道如何确定规划路线修建铁路使得Z国的交通系统的“不便利值”最小,以及有多少种不同的规划路线的选择
方案使得“不便利值”达到最小。当然方案总数可能非常大,小Z只关心这个天文数字modQ后的值。注意:规划路
线1-2-3和规划路线3-2-1是等价的,即将一条规划路线翻转依然认为是等价的。两个方案不同当且仅当其中一个方
案中存在一条规划路线不属于另一个方案。

Input

  第一行包含三个正整数N、M、Q,其中N表示城市个数,M表示公路总数,N个城市从1~N编号,其中编号为1的是首都
。Q表示上文提到的设计路线的方法总数的模数。接下来M行,每行两个不同的正数ai、bi(1≤ai,bi≤N)表示有一条
公路连接城市ai和城市bi。输入数据保证一条公路只出现一次。

Output

  包含两行。第一行为一个整数,表示最小的“不便利值”。第二行为一个整数,表示使“不便利值”达到最小时
不同的设计路线的方法总数modQ的值。如果某个城市无法到达首都,则输出两行-1。

Sample Input

5 4 100
1 2
4 5
1 3
4 1

Sample Output

1
10

HINT

  以下样例中是10种设计路线的方法:

(1)4-5

(2)1-4-5

(3)4-5,1-2

(4)4-5,1-3

(5)4-5,2-1-3

(6)2-1-4-5

(7)3-1-4-5

(8)1-4

(9)2-1-4

(10)3-1-4

【数据规模和约定】

对于100%的数据,满足1≤N,M≤100000,1≤Q≤120000000。

题意:给N个点组成的森林,边权为1,可以修改任意边权为0,但与每个点直接相邻且权值为0的边至多有2条,要令所有点到1号点的最大距离最小,输出该距离和方案数。

思路:首先判断是否一棵树,不是就输出-1。然后进行树形dp,dp[i][j][k](k<=2)表示以i为根的子树到i点的最远距离<=j,且i跟它的k个儿子的边置0的方案数。那么我们枚举j,每次都跑一次树形dp就可以列出转移方程了,那么j(也就是答案)枚举到多少为止呢?根据树链剖分的定义,至多有logN条轻边,而轻边就是这里的权为1的边,所以枚举的次数不会很多。最后由于涉及乘法取模,模为0的时候设为mod本身,否则方程转移时乘以0又是0就会WA。

# include <iostream>
# include <cstdio>
# include <vector>
# include <cmath>
# include <cstring>
# define pb push_back
using namespace std;
typedef long long LL;
const int maxn = 1e5+30;
vector<int>g[maxn];
int dp[maxn][20][3]={0}, mod;
int n, m, u, v, pre[maxn];
int read()
{int x=0; char ch=getchar();while (ch<'0' || ch>'9') ch=getchar();while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }return x;
}
int find(int x)
{if(x != pre[x]) pre[x] = find(pre[x]);return pre[x];
}
LL cal(LL x)
{if(!x) return 0;LL t = x%mod;return t?t:mod;
}
void dfs(int cur, int lim, int pre)
{dp[cur][lim][0] = 1;for(int i=0; i<g[cur].size(); ++i){int to = g[cur][i];if(to == pre) continue;dfs(to, lim, cur);LL t1 = lim?cal((LL)dp[to][lim-1][0]+dp[to][lim-1][1]+dp[to][lim-1][2]):0;//不置0LL t2 = cal((LL)dp[to][lim][0]+dp[to][lim][1]);//置0dp[cur][lim][2]=cal((LL)dp[cur][lim][2]*t1+(LL)dp[cur][lim][1]*t2);dp[cur][lim][1]=cal((LL)dp[cur][lim][1]*t1+(LL)dp[cur][lim][0]*t2);dp[cur][lim][0]=cal((LL)dp[cur][lim][0]*t1);}
}
int main()
{n = read();m = read();mod = read();for(int i=1; i<=n; ++i) pre[i] = i;while(m--){u = read(), v = read();g[u].pb(v);g[v].pb(u);pre[find(u)] = pre[find(v)];}int anc = find(1);for(int i=2; i<=n; ++i)if(find(i) != anc)return 0*printf("-1\n-1");for(int i=0;;++i){dfs(1,i,0);if(dp[1][i][0] || dp[1][i][1] || dp[1][i][2]){printf("%d\n",i);printf("%d\n",(dp[1][i][0]+dp[1][i][1]+dp[1][i][2])%mod);return 0;}}return 0;
}

BZOJ1063:道路设计(树形dp)相关推荐

  1. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  2. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  3. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  4. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  5. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  6. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  7. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  8. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

  9. 树形dp ---- 2018年杭电多校第二场 H travel

    题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...

最新文章

  1. 36岁北航校友打造中国自主AI芯片第一股!挖矿起家,6年IPO,市值百亿
  2. LeetCode Pascal's Triangle
  3. Linux零拷贝的原理
  4. 推荐一个好用的Chrome扩展,专门处理xml的,名叫XML Tree
  5. 试用c51语言采样连续5次异常_学会这些自闭症儿童语言训练技巧,孩子开口说话不再困难...
  6. spring webscoket服务端使用记录
  7. 【技术人快报190期】Linux之父脏话连篇大骂Intel漏洞补丁+我国首颗高通量卫星投入使用...
  8. Java中的断言 Assert
  9. VS报错:“Stack around the variable XX was corrupted”
  10. hd_Lanswitch Web System
  11. 学习笔记(03):2020软考数据库系统工程师-基础知识培训视频-计算机系统--安全性可靠性与性能评测(一)...
  12. php while循环 selecrt下拉框 option默认选中
  13. 信号处理算法方向的一些SCI杂志(他人经验)
  14. 英语语法之简单句型(一)
  15. 狂热分子——码头工人的哲学沉思录
  16. 刘备当年是如何面试诸葛亮的?
  17. NVIDIA显卡架构
  18. java 微信定位到市_java 微信公众号地理位置获取
  19. 人脸识别、行人识别、图片库
  20. elasticsearch--Master选举

热门文章

  1. 惠普计算机配置与选购,惠普笔记本电脑选购常识_惠普笔记本电脑使用常识 -真快乐商城...
  2. 云数据库被黑客攻击了
  3. Android Debug Bridge (ADB) v1.0.31
  4. 零打碎敲学Android 三 —俄罗斯,你为什么是方块的
  5. 基于摄像头定时触发拍照的传统机械水电燃气表数据采集抄表方案
  6. 无刷直流电机的性能与在采样泵上的运用
  7. android中用代码实现禁止页面旋转,Android通过代码禁止屏幕旋转
  8. tftp 源代码解析
  9. 下载windows操作系统
  10. 键盘操作电脑,速度更快!