当前位置: 首页 > news >正文

【图论】基环树

基环树其实并不是树,是指有n个点n条边的图,我们知道n个点n-1条边的连通图是树,再加一条边就会形成一个环,所以基环树中一定有一个环,长下面这样:
在这里插入图片描述
由基环树可以引申出基环内向树基环外向树

基环内向树如下,特点是每个点的出度为1
在这里插入图片描述
基环外向树如下,特点是每个点的入度为1
在这里插入图片描述
下面放点题,做到相关题目随时更新

基环树+组合数学

CF 1454E Number of Simple Paths

先记录环上的点,每个环上的点引出去的子树中,两点之间都只有一条路径,然后子树和其他点之间都有两条路径(因为有个环),可以循环计算每个子树,答案累加即可

#include <bits/stdc++.h>using namespace std;typedef pair<int, int> PII;#define int long longvoid solve()
{int n;cin >> n;vector<vector<int>> g(n + 1);vector<int> in(n + 1);for (int i = 0 ;i < n; i ++ ){int a, b;cin >> a >> b;g[a].push_back(b);g[b].push_back(a);in[a] ++ , in[b] ++ ;}queue<int> q;for (int i = 1; i <= n; i ++ ) {if (in[i] == 1) q.push(i);}while (q.size()){auto t = q.front();q.pop();for (int i = 0; i < g[t].size(); i ++ ){int j = g[t][i];in[j] -- ;if (in[j] == 1) q.push(j);}}vector<int> huan;vector<int> st(n + 1);for (int i = 1; i <= n; i ++ ){if (in[i] > 1){huan.push_back(i);st[i] = true;}}int ans = 0, sumtmp, sum = 0;vector<bool> visited(n + 1);function<void(int, int)> dfs = [&](int u, int fa){sumtmp ++ ;if (visited[u]) return;visited[u] = true;for (int i = 0; i < g[u].size(); i ++ ){int j = g[u][i];if (j == fa || visited[j] || st[j]) continue;dfs(j, u);}return;};for (auto i : huan){sumtmp = 0;dfs(i, -1);ans += sumtmp * (sumtmp - 1) / 2;ans += (sumtmp - 1) * (n - sumtmp - sum) * 2;sum += sumtmp - 1;}ans += huan.size() * (huan.size() - 1);cout << ans << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t -- ){solve();}
}

基环内向树+dfs

牛客 寒假集训1K 牛镇公务员考试

基环内向树(准确的说应该是森林)

编号 i 向 a[i] 连边,表示对其限制,我们可以发现环之外的链对答案没什么影响,因为确定了环上一点,可以倒推出链上的所有答案(原因就是约束关系),所以我们在环上任取一点,枚举这个点的五种答案,然后遍历一下环看这个答案是否合法

因为不保证联通,所以需要遍历每一个点

#include <bits/stdc++.h>using namespace std;#define int long long
using i64 = long long;typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;const int N = 1000010;
const int maxn = 1e6 + 1;
const int mod = 998244353;void solve()
{int n;cin >> n;vector<int> a(n + 1);vector<string> s(n + 1);for (int i = 1; i <= n; i ++ ) cin >> a[i] >> s[i];vector<bool> st(n + 1);int ans = 1;for (int i = 1; i <= n; i ++ ){if (st[i]) continue;int j = i;vector<int> huan;for (; !st[j]; j = a[j]){huan.push_back(j);st[j] = true;}auto iter = find(huan.begin(), huan.end(), j);if (iter == huan.end()) continue;huan = {iter, huan.end()};int tmp = 0;for (int k = 0; k < 5; k ++ ){int h = k;for (auto t : huan) h = (int)(s[t][h] - 'A');tmp += h == k;}ans = ans * tmp % mod;}cout << ans << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;// cin >> t;while (t -- ){solve();}
}

相关文章:

【图论】基环树

基环树其实并不是树&#xff0c;是指有n个点n条边的图&#xff0c;我们知道n个点n-1条边的连通图是树&#xff0c;再加一条边就会形成一个环&#xff0c;所以基环树中一定有一个环&#xff0c;长下面这样&#xff1a; 由基环树可以引申出基环内向树和基环外向树 基环内向树如…...

如何快速捕获和验证用户软件需求,实现快速迭代

在软件开发过程中&#xff0c;快速捕获和验证用户需求&#xff0c;以及迅速迭代功能&#xff0c;是保持项目敏捷性和用户满意度的关键。下面将介绍一些建议&#xff0c;帮助你在软件开发过程中更有效地满足用户需求。 1. 深入沟通与用户互动 要捕获用户需求&#xff0c;必须与…...

爱上算法:每日算法(24-2月4号)

&#x1f31f;坚持每日刷算法&#xff0c;&#x1f603;将其变为习惯&#x1f91b;让我们一起坚持吧&#x1f4aa; 文章目录 [232. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/)思路CodeJavaC 复杂度 [225. 用队列实现栈](https://leetcode.cn/…...

【Node系列】创建第一个服务器应用

文章目录 一、node介绍二、node创建应用三、node创建应用步骤四、相关链接 一、node介绍 Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;可以用于构建高性能的网络应用程序。它采用事件驱动、非阻塞I/O模型&#xff0c;使得程序可以以高效地方式处理并发请求…...

Linux命令基础学习 (2月4日打卡

1. ls - 列出目录内容 命令格式&#xff1a;ls [选项] [文件/目录] 常用选项&#xff1a; -l&#xff1a;以详细列表格式显示-a&#xff1a;显示所有文件&#xff0c;包括以.开头的隐藏文件 2. mkdir - 创建新目录 命令格式&#xff1a;mkdir [选项] 目录名 常用选项&…...

Python 基础知识概览

Python是一种简洁、易学、强大的编程语言&#xff0c;广泛应用于各种领域&#xff0c;包括Web开发、数据分析、人工智能等。本文将介绍一些Python的基础知识&#xff0c;帮助初学者建立对这门语言的基本了解。 1. Python 的简介 Python是一种高级、面向对象、解释型的编程语言…...

Adobe Camera Raw for Mac v16.1.0中文激活版

Adobe Camera Raw for Mac是一款强大的RAW格式图像编辑工具&#xff0c;它能够处理和编辑来自各种数码相机的原始图像。以下是关于Adobe Camera Raw for Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;Adobe Camera Raw for Mac v16.1.0中文激活版 RAW格式支持&…...

zabbix自定义监控项

zabbix自定义监控项 1.安装zabbix_get软件 [rootchang local]# yum install zabbix-get2.编辑自定义监控项文件 [rootchang ~]# vim /etc/zabbix/zabbix_agentd.d/cpu.conf UserParametercheck_cpu,top -bn 1 -i -c |grep id |cut -d , -f 4 | tr -d id #UserParameter表示…...

使用Pycharm在本地调用chatgpt的接口

目录 1.安装环境 2.建立多轮对话的完整代码&#xff08;根据自己使用的不同代理需要修改端口&#xff08;port&#xff09;&#xff09; 3.修改代码在自己的Pycharm上访问chagpt的api并实现多轮对话&#xff0c;如果不修改是无法成功运行的。需要确定秘钥和端口以保证正常访…...

HarmonyOS远程真机调试方法

生成密钥库文件 打开DevEco Studio&#xff0c;点击菜单栏上的build&#xff0c; 填一些信息点击&#xff0c;没有key的话点击new一个新的key。 生成profile文件 AppGallery Connect (huawei.com) 进入该链接网站&#xff0c;点击用户与访问将刚生成的csr证书提交上去其中需…...

基于SpringBoot的后端导出Excel文件

后端导出Excel&#xff0c;前端下载。 系列文章指路&#x1f449; 系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类 文章目录 后端导出Excel引入依赖写入响应 前端下载后端导出失败和成功返回的内容类型不同&#xff0c;因此需要分别判断。 工具类ServletUti…...

2 月 5 日算法练习- 动态规划

DP&#xff08;动态规划&#xff09;全称Dynamic Programming&#xff0c;是运筹学的一个分支&#xff0c;是一种将复杂问题分解成很多重叠的子问题、并通过子问题的解得到整个问题的解的算法。 在动态规划中有一些概念&#xff1a; n<1e3 [][] &#xff0c;n<100 [][][…...

SpringBoot整合EasyCaptcha图形验证码

简介 EasyCaptcha&#xff1a;https://github.com/ele-admin/EasyCaptcha Java图形验证码&#xff0c;支持gif、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目。 添加依赖 <dependency><groupId>com.github.whvcse</groupId><artifactId…...

学习数据结构和算法的第3天

常数循环的复杂度 计算Func4的时间复杂度 voidFunc4(int N) { int count 0; for (int k 0; k < 100; k) { count; } printf("%d\n", count); }O&#xff08;1&#xff09; 不是代表算法运行一次&#xff0c;是常数次 strchar的时间复杂度 #include<stdi…...

SpringBoot实战第三天

今天主要完成了&#xff1a; 新增棋子分类 棋子分类列表 获取棋子分类详情 更新棋子分类 更新棋子分类和添加棋子分类_分组校验 新增棋子 新增棋子参数校验 棋子分类列表查询(条件分页) 先给出分类实体类 Data public class Category {private Integer id;//主键IDNot…...

mysql学习打卡day22

今日成果&#xff1a; select * from employees where salary > (select avg(salary) from employees); -- 查询超过平均工资的员工select * from clients where client_id not in (select distinct client_id from invoices); -- 查询没有发票的用户 感谢各位读者查阅&…...

Unity | Spine动画记录

https://blog.csdn.net/linshuhe1/article/details/79792432 https://blog.csdn.net/winds_tide/article/details/128925407 1.需要的三个文件 通常制作好的 Spine 动画导出时会有三个文件&#xff1a; .png 、.json 和 .atlas&#xff1a; skeleton-name.json 或 skeleton-…...

【Flink】FlinkSQL实现数据从MySQL到MySQL

简介 我们在实际开发过程中可以使用Flink实现数据从MySQL传输到MySQL具体操作,本例子Flink版本1.13.6,具体操作如下: 创建mysql测试表 下面语句创建了mysql原表和目标表,并插入一条语句到mysql原表中 CREATE TABLE `mysql_source` ( `id` int(11) unsigned NOT NULL AUT…...

python爬虫抓取新闻并且植入自己的mysql远程数据库内

python爬虫抓取新闻并且植入自己的mysql远程数据库内&#xff01;这个代码是我自己写了很久才写好的&#xff0c;分享给大家。喜欢的点个赞。 # -*- coding: utf-8 -*- from xml.etree import ElementTree as ET import datetime import randomimport pymysql from selenium im…...

netty实现简单的客户端、服务端互相发消息

引入maven依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.20.Final</version> </dependency> 一、服务端 1、创建服务端启动类 public class MyServer {public static voi…...

AI编程革命:重塑程序员未来(一)

AI编程时代到来AI不会让程序员消失&#xff0c;但会深刻重塑这个职业。当代码生成变得轻而易举&#xff0c;程序员 的角色将从“代码编写者”升级为“问题解决者”与“架构设计师”。未来的核心竞争力&#xff0c;在于 理解复杂业务、设计系统逻辑&#xff0c;并用人类独有的创…...

破局双系统文件壁垒:WinBtrfs驱动终极应用指南

破局双系统文件壁垒&#xff1a;WinBtrfs驱动终极应用指南 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs 在Windows与Linux双系统环境中&#xff0c;用户常常面临跨系统文件访问的难题…...

油猴插件开发必备:VSCode中高效使用Tampermonkey API的10个技巧

油猴插件开发必备&#xff1a;VSCode中高效使用Tampermonkey API的10个技巧 在浏览器扩展开发领域&#xff0c;Tampermonkey&#xff08;油猴&#xff09;以其轻量级和灵活性赢得了大量开发者的青睐。作为一款用户脚本管理器&#xff0c;它允许开发者通过JavaScript快速定制网页…...

W25Q16 Flash存储器的5个常见应用场景及避坑指南

W25Q16 Flash存储器的5个常见应用场景及避坑指南 在嵌入式系统开发中&#xff0c;数据存储一直是个绕不开的话题。想象一下&#xff0c;你花了一周时间调试的设备&#xff0c;重启后所有用户设置都消失了&#xff1b;或者精心设计的UI界面&#xff0c;因为字库加载失败变成了乱…...

快速原型设计:基于快马平台构建vmware安装交互演示应用

今天想和大家分享一个特别实用的开发经验&#xff1a;如何用InsCode(快马)平台快速制作VMware虚拟机安装的交互式演示工具。这个项目特别适合技术文档编写者或IT培训师&#xff0c;能让你用最短时间把枯燥的安装教程变成生动可操作的原型。 为什么需要交互式演示&#xff1f; 传…...

BetterNCM Installer:让网易云音乐插件安装化繁为简的利器

BetterNCM Installer&#xff1a;让网易云音乐插件安装化繁为简的利器 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否曾因复杂的插件安装流程望而却步&#xff1f;是否在面对命…...

关于统好 AI可持续发展三大趋势

问&#xff1a;如何理解统好 AI 的可持续发展趋势&#xff1f;答&#xff1a;统好 AI 的可持续发展&#xff0c;核心是技术、业务与运营长期适配&#xff0c;不追求短期迭代&#xff0c;而是围绕企业全生命周期需求构建稳定演进路径。绵阳统好软件有限公司以一体化底座为基础&a…...

Vivado IOBUF原语使用避坑:为什么你的双向端口信号总连不上?

Vivado IOBUF原语深度解析&#xff1a;从原理到实战的双向端口设计指南 在FPGA开发中&#xff0c;双向端口&#xff08;inout&#xff09;的设计一直是工程师们容易踩坑的领域。特别是当我们需要将独立的输入输出信号合并为顶层inout端口时&#xff0c;Vivado提供的IOBUF原语看…...

亚马逊Buy for Me代购服务全流程实测:从下单到收货的5个关键步骤

亚马逊Buy for Me代购服务实战手册&#xff1a;从零开始的安全跨境购物指南 跨境购物早已不是新鲜事&#xff0c;但每次打开海外电商网站时&#xff0c;那些"仅限本地销售"的提示依然让人头疼。去年冬天&#xff0c;我为了给家人买一款日本限定的保温杯&#xff0c;辗…...

手把手教你用QQbot对接多青龙面板(含CK分配技巧)

手把手教你用QQbot对接多青龙面板&#xff08;含CK分配技巧&#xff09; 在自动化管理工具日益普及的今天&#xff0c;如何高效管理多个青龙面板成为许多开发者的痛点。本文将带你从零开始&#xff0c;通过QQbot实现多青龙面板的智能对接&#xff0c;并深入探讨Cookie&#xff…...