1063: [Noi2008]道路设计 - BZOJ
Description
Z 国坐落于遥远而又神奇的东方半岛上,在小Z 的统治时代公路成为这里主要的交通手段。Z 国共有n 座城市,一些城市之间由双向的公路所连接。非常神奇的是Z 国的每个城市所处的经度都不相同,并且最多只和一个位于它东边的城市直接通过公路相连。Z 国的首都是Z 国政治经济文化旅游的中心,每天都有成千上万的人从Z 国的其他城市涌向首都。 为了使Z 国的交通更加便利顺畅,小Z 决定在Z 国的公路系统中确定若干条规划路线,将其中的公路全部改建为铁路。 我们定义每条规划路线为一个长度大于1 的城市序列,每个城市在该序列中最多出现一次,序列中相邻的城市之间由公路直接相连(待改建为铁路)。并且,每个城市最多只能出现在一条规划路线中,也就是说,任意两条规划路线不能有公共部分。 当然在一般情况下是不可能将所有的公路修建为铁路的,因此从有些城市出发去往首都依然需要通过乘坐长途汽车,而长途汽车只往返于公路连接的相邻的城市之间,因此从某个城市出发可能需要不断地换乘长途汽车和火车才能到达首都。 我们定义一个城市的“不便利值”为从它出发到首都需要乘坐的长途汽车的次数,而Z 国的交通系统的“不便利值”为所有城市的不便利值的最大值,很明显首都的“不便利值”为0。小Z 想知道如何确定规划路线修建铁路使得Z 国的交通系统的“不便利值”最小,以及有多少种不同的规划路线的选择方案使得“不便利值”达到最小。当然方案总数可能非常大,小Z 只关心这个天文数字mod Q 后的值。 注意:规划路线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
包含两行。第一行为一个整数,表示最小的“不便利值”。 第二行为一个整数,表示使“不便利值”达到最小时不同的设计路线的方法总数 mod Q 的值。如果某个城市无法到达首都,则输出两行-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 【数据规模和约定】对于20%的数据,满足N,M ≤ 10。对于50%的数据,满足N,M ≤ 200。对于60%的数据,满足N,M ≤ 5000。对于100%的数据,满足1 ≤ N,M ≤ 100000,1 ≤ Q ≤ 120000000。
树dp(首先判断是否连通),因为最后的方案不一定要所有的都选最优方案,所以dp[i][j][k]表示以节点i为根,不便利值不大于j,节点i向儿子连了k条边的方案数(k=0,1,2)
我们很轻易的想到了下面这个方程(借将狼踩尽的图)
关键是这个肯定超时,所以要优化(每搜索一个儿子做一遍,初始f[i,j,0]=1)
我是这样理解的,其实相当于每次加上一个儿子,然后更新f的值(这样应该很清楚吧)
- const
- maxn=;
- var
- f:array[..maxn,-..,..]of int64;
- first,next,last:array[..maxn*]of longint;
- flag:array[..maxn]of boolean;
- n,m,tot:longint;
- q:int64;
- procedure insert(x,y:longint);
- begin
- inc(tot);
- last[tot]:=y;
- next[tot]:=first[x];
- first[x]:=tot;
- end;
- procedure init;
- var
- i,x,y:longint;
- begin
- read(n,m,q);
- if m<>n- then
- begin
- writeln(-);
- writeln(-);
- halt;
- end;
- for i:= to m do
- begin
- read(x,y);
- insert(x,y);
- insert(y,x);
- end;
- end;
- function get(x:int64):int64;
- begin
- if (x>) and (x mod q=) then exit(q);
- exit(x mod q);
- end;
- procedure dfs(x:longint);
- var
- i,j:longint;
- f1,f2:int64;
- begin
- j:=first[x];
- flag[x]:=true;
- for i:= to do
- f[x,i,]:=;
- while j<> do
- begin
- if flag[last[j]]=false then
- begin
- dfs(last[j]);
- for i:= to do
- begin
- f1:=f[last[j],i,]+f[last[j],i,];
- f2:=f[last[j],i-,]+f[last[j],i-,]+f[last[j],i-,];
- f[x,i,]:=get(f[x,i,]*f2+f[x,i,]*f1);
- f[x,i,]:=get(f[x,i,]*f2+f[x,i,]*f1);
- f[x,i,]:=get(f[x,i,]*f2);
- end;
- end;
- j:=next[j];
- end;
- end;
- procedure work;
- var
- i:longint;
- begin
- dfs();
- for i:= to do
- if f[,i,]+f[,i,]+f[,i,]> then
- begin
- writeln(i);
- writeln((f[,i,]+f[,i,]+f[,i,])mod q);
- exit;
- end;
- writeln(-);
- writeln(-);
- end;
- begin
- init;
- work;
- end.
1063: [Noi2008]道路设计 - BZOJ的更多相关文章
- BZOJ1063 NOI2008 道路设计 树形DP
题目传送门: BZOJ 题意精简版:给出一棵树,在一种方案中可以将树的若干链上的所有边的边权改为$0$,但需要保证任意两条链之间没有交点.问最少的一种方案,使得从根节点到其他节点经过的边的边权和的最大 ...
- [bzoj1063][Noi2008]道路设计
来自FallDream的博客,未经允许,请勿转载,谢谢. Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代公路成为这里主要的交通手段.Z国共有n座城市,一些城市之间由双向的公路所连接.非常神奇的是 ...
- [NOI2008] 道路设计
link 思维题目,题目描述其实说的就是这是一个树,想到树形$dp$.若两个铁路不向交,则每个点的度都$\leq 2$.所以现在就可以搞dp了. 怎么去维护答案,容易想到设$dp(i,j,k)$为现在 ...
- 并不对劲的[Noi2008]道路设计
Time Limit: 20 Sec Memory Limit: 162 MB Submit: 931 Solved: 509 [Submit][Status][Discuss] Descriptio ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- dp专练
dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- BZOJ 1063 道路设计NOI2008
http://www.lydsy.com/JudgeOnline/problem.php?id=1063 题意:给你一棵树,也有可能是不连通的,把树分成几个链,求每个点到根经过的最大链数最小,而且要输 ...
- [BZOJ]1063 道路设计(Noi2008)
省选一试后的第一篇blog! Description Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代,公路成为这里主要的交通手段.Z国共有n座城市,一些城市之间由双向的公路所连接.非常神奇的是Z ...
随机推荐
- display:none与visible:hidden区别
if(list.style.display=='none'){ list.style.display='block'; }else{ ...
- 原生javascript焦点轮播图
刚刚学会,写了一个轮播图效果,不过bug蛮多,请高手指点一下,谢谢 <!DOCTYPE html> <html> <head> <meta charset=& ...
- django 学习-2 模板
如何使用渲染模板的方法来显示内容. 1.创建一个项目dream django-admin.py startproject dream cd dream 再创建一个应用 python m ...
- C#WebBrowser控件使用教程与技巧
获取非input控件的值 webBrowser1.Document.All["控件ID"].InnerText;或webBrowser1.Document.GetElementBy ...
- css3学习笔记之效果
<!DOCTYPE html> <html> <head> <style> #t1 { border-radius: 15px; width:60px; ...
- IE浏览器打开 「兼容性视图」
有些IE上的网页控件需要打开兼容性视图才能使用,不知道是Javascript的原因,还是CSS的原因. 使用环境是用C语言配合boa服务器实现的CGI程序.
- windows同时安装两个jdk
两个项目需求不同,需要不同的jdk(1.7,1.8),所以每次切换项目的时候就会重新卸载原有的,在安装新的,比较麻烦. 就查资料看可以同时安装多个jdk,但是每次只能配置一个环境变量.安装的时候还是遇 ...
- 一.Nginx的特性和一些知识点
一.Nginx的特性和一些知识点 1.基本功能服务器 处理静态文件(静态资源的web),支持 反向代理服务器,支持缓存.负载均衡.支持FastCGI 模块化机制,非DOS机制,支持 ...
- Oracle管理基础
1.exp导出命令
- input获取永久焦点
$(function () { $('#test').blur(function () { var that = this; //或者用闭包 setTimeout(function () { $(th ...