[NOI2008] 设计路线

题目描述

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 是等价的,即将一条规划路线翻转 依然认为是等价的。两个方案不同当且仅当其中一个方案中存在一条规划路线不 属于另一个方案。

输入格式

第一行包含三个正整数 N、M、Q,其中 N 表示城市个数, M 表示公路总数,N 个城市从 1~N 编号,其中编号为 1 的是首都。Q 表示上文 提到的设计路线的方法总数的模数。

接下来 M 行,每行两个不同的正数 ai、 bi (1≤ ai , bi ≤ N)表示有一条公路连接城市 ai和城市 bi。

输入数据保证一条公路只出现 一次。

输出格式

应包含两行。第一行为一个整数,表示最小的“不便利值”。

第二行为一个整数,表示使“不便利值”达到最小时不同的设计路线的方 法总数 mod Q 的值。

如果某个城市无法到达首都,则输出两行-1。

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>inline int read() {char c = getchar(); int x = 0;while (c < '0' || c > '9') { c = getchar(); }while (c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c & 15); c = getchar(); }return x;
}const int maxN = 100005, maxR = 12;int n, m, p, f[3][maxN], g[3][maxR][maxN];struct List {int len, fst[maxN], nxt[maxN << 1], to[maxN << 1];List() { memset(fst, -1, sizeof(fst)); }inline void insert(int u, int v) { nxt[len] = fst[u]; to[len] = v; fst[u] = len++; }inline void link(int u, int v) { insert(u, v); insert(v, u); }
} e;inline int add(int x, int y) { x += y; return x >= p ? x - p : x; }
inline int mul(int x, int y) { return (long long) x * y % p; }void dfs1(int u, int fa) {f[0][u] = 1; f[1][u] = f[2][u] = 1e9;for (int i = e.fst[u], v; ~i; i = e.nxt[i]) {v = e.to[i];if (v == fa) { continue; } dfs1(v, u);f[2][u] = std::min(std::max(f[2][u], f[2][v] + 1), std::max(f[1][u], f[1][v]));f[1][u] = std::min(std::max(f[1][u], f[2][v] + 1), std::max(f[0][u], f[1][v]));f[0][u] = std::max(f[0][u], f[2][v] + 1);}f[1][u] = std::min(f[0][u], f[1][u]); f[2][u] = std::min(f[1][u], f[2][u]);
}
void dfs2(int u, int fa) {for (int i = 1; i <= f[2][1]; i++) { g[0][i][u] = 1; }for (int i = e.fst[u], v; ~i; i = e.nxt[i]) {v = e.to[i];if (v == fa) { continue; } dfs2(v, u);for (int i = 1; i <= f[2][1]; i++) {g[2][i][u] = add(mul(g[2][i][u], g[2][i - 1][v]), mul(g[1][i][u], g[1][i][v]));g[1][i][u] = add(mul(g[1][i][u], g[2][i - 1][v]), mul(g[0][i][u], g[1][i][v]));g[0][i][u] = mul(g[0][i][u], g[2][i - 1][v]);}}for (int i = 1; i <= f[2][1]; i++) { g[1][i][u] = add(g[0][i][u], g[1][i][u]); g[2][i][u] = add(g[1][i][u], g[2][i][u]); }
}int main() {n = read(); m = read(); p = read();if (m != n - 1) { printf("-1\n-1\n"); return 0; }for (int i = 1; i <= m; i++) { e.link(read(), read()); }dfs1(1, 0); dfs2(1, 0);printf("%d\n%d\n", f[2][1] - 1, g[2][f[2][1]][1]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-upload文件上传(只能上传一个文件且再次上传替换上一个文件) vue3+vite+ts

组件&#xff1a; <template><el-upload class"upload-demo" v-model:file-list"fileList" ref"uploadDemo" action"/public-api/api/file" multiple:on-preview"handlePreview" :on-remove"handleRemove&quo…

UI 自动化稳定性用例实战经验分享!

目录 前言&#xff1a; 大家常说 UI 自动化不稳定&#xff0c;那又如何提高稳定性呢&#xff1f; 操作界面非预期的弹框、广告、浮层 测试系统的 A/B 策略 总结&#xff1a; 前言&#xff1a; 稳定性测试是软件测试的一个重要方面&#xff0c;它旨在评估软件在不同负载和…

时序数据库有哪些

时序数据库全称为时间序列数据库。时间序列数据库指主要用于处理带时间标签&#xff08;按照时间的顺序变化&#xff0c;即时间序列化&#xff09;的数据&#xff0c;带时间标签的数据也称为时间序列数据。 时间序列数据主要由电力行业、化工行业、气象行业、地理信息等各类型…

一起学SF框架系列5.8-spring-Beans-注解bean解析4-bean解析

前面三节主要讲了如何加载注解Bean的BeanDefinition&#xff0c;执行环节是在DefaultBeanDefinitionDocumentReader.parseBeanDefinitions中用BeanDefinitionParserDelegate.parseCustomElement(ele)加载的&#xff0c;实际上没对注解真正进行解析。本节主要讲述注解bean如何被…

Mysql关于进程中的死锁和解除锁

Mysql 经常会遇到语句或者存储过程长时间没有反应&#xff0c;大概率就是挂掉了&#xff0c;或者死锁了。 可通过如下几种方式来查看当前进程状态 1. 查询数据库所有的进程状态 SHOW PROCESSLIST SELECT * FROM information_schema.PROCESSLIST; 2. 查询在锁的事务 SELECT…

opencv 图像腐蚀膨胀 erode dilate

#include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dstbin, distancetransform,rel, rel2;img imread("m3.jpg");//转为灰度图cvtColor(img, dst, COLOR_BGR2GRAY);//二…

从Vue2到Vue3【五】——新的组件(Fragment、Teleport、Suspense)

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介从Vue2到Vue3【一】Composition API&#xff08;第一章&#xff09;从Vue2到Vue3【二】Composition API&#xff08;第二章&#xff09;从Vue2到Vue3【三】Composition API&#xff08;第三章&#xff09;从Vue2到Vue3【四】C…

Flutter 网络请求

在Flutter 中常见的网络请求方式有三种&#xff1a;HttpClient、http库、dio库&#xff1b; 本文简单介绍 使用dio库使用。 选择dio库的原因&#xff1a; dio是一个强大的Dart Http请求库&#xff0c;支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载…

网络通信原理(第十八课)

网络通信原理(第十八课) 4.1 回顾 1.什么是TCP/IP 目前应用广泛的网络通信协议集 国际互联网上电脑相互通信的规则、约定。 2.主机通信的三要素 IP地址:用来标识一个节点的网络地址(区分网络中电脑身份的地址,如人有名字) 子网掩码:配合IP地址确定网络号 IP路由:网…

10分钟内入门 ArcGIS Pro

本文来源&#xff1a;GIS荟 大家好&#xff0c;这篇文章大概会花费你10分钟的时间&#xff0c;带你入门 ArcGIS Pro 的使用&#xff0c;不过前提是你有 ArcMap 使用经验。 我将从工程文件组织方式、软件界面、常用功能、编辑器、制图这5个维度给大家介绍。 演示使用的 ArcGI…

FPGA——PLD的区别以及各自的特点

目录 一、概述二、PLD的优点三、PLD的分类1、PROM&#xff08;可编程只读存储器&#xff09;&#xff1a;2、PAL&#xff08;可编程阵列逻辑&#xff09;3、GAL&#xff08;通用阵列逻辑&#xff09;4、CPLD &#xff08;复杂PLD&#xff09;5、FPGA&#xff08;现场可编程门阵…

【Nodejs】nodejs内置模块(中)

1.路劲处理模块 path 1.1 模块概览 在nodejs中&#xff0c;path是个使用频率很高&#xff0c;但却让人又爱又恨的模块。部分因为文档说的不够清晰&#xff0c;部分因为接口的平台差异性。将path的接口按照用途归类&#xff0c;仔细琢磨琢磨&#xff0c;也就没那么费解了。 1.…

计算机网络模型

计算机网络模型 网络模型网络模型中各层对应的协议封装与分用TCP/IP协议簇的组成 网络模型 OSI 七层模型 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP四层模型 应用层、传输层、网络层、网络接口层 TCP/IP五层模型 应用层、传输层、网络层、数据链路…

iOS transform rotate总结

研究了一下transform的旋转设置&#xff0c;调了半天还以为是旋转写错了&#xff0c;发现是两个不同的view对象写错了&#xff0c;不管怎么说&#xff0c;还是记录一下旋转相关的操作吧。 参数都是弧度。 以一个图片来举例。 let img UIImageView.init() img.image UIImage…

Asp.Net 使用Log4Net (封装帮助类)

Asp.Net 使用Log4Net (封装帮助类) 1. 创建Log4Net帮助类 首先&#xff0c;在你的项目中创建一个Log4Net帮助类&#xff0c;用于封装Log4Net的配置和日志记录逻辑。 using log4net; using log4net.Config;public class LogHelper {private static readonly ILog log LogMan…

k8s集群环境的搭建

1.环境规划 1.1 集群类型 Kubernetes集群大致分为两类&#xff1a;一主多从和多主多从。 一主多从&#xff1a;一个Master节点和多台Node节点&#xff0c;搭建简单&#xff0c;但是有单机故障风险&#xff0c;适合用于测试环境。 多主多从&#xff1a;多台Master和多台Node节点…

ubuntu与windows之间的文件共享

最近在做项目&#xff0c;需要用到ubuntu进行代码编译生成可执行文件&#xff0c;但是我个人阅读和编写代码喜欢用source insight这个软件IDE。安利一下这个软件&#xff0c;阅读代码和编辑代码真的很棒啊&#xff0c;谁用谁知道吧&#xff01; 由于在ubuntu中安装source insig…

RocketMQ基本概念与入门

文章目录 MQ基本结构依赖案例:productConsumer 核心概念1.nameserver2.broker3.主题队列4.queue队列5. 生产者6.消费者分组和生产者分组7.消费点位 MQ基本结构 message: 消息数据对象product: 程序代码,生成消息,发送消息到队列consumer: 程序代码,监听(绑定)队列,获取消息,执行…

全志F1C200S嵌入式驱动开发(spi-nor image制作)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 一般soc系统里面添加spi-nor flash芯片,特别是对linux soc来说,都是把它当成文件系统来使用的。spi-nor flash和spi-nand flash相比,虽然空间小了点,但是胜在稳定,这是很多工业…

(二)RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】

Lison <dreamlison163.com>, v1.0.0, 2023.06.22 RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】 文章目录 RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】**安装Erlang**安装RabbitMQ账户管理管控台Docker安装RabbitM…