推销洛谷博客:https://www.luogu.com.cn/article/znmr9iu9

Link:Luogu - P3907

这里默认题目中指的环都是“简单环”(即没有“环套环”的情况)。

众所周知,树是图的一种特殊情况,且一定无环。如果我们想要得到一个有环的复杂图,有一种办法是考虑先建一棵树,然后不断加入非树边。

那本题如果要“找环”,我们不妨把这个过程反过来。先对于原图中每个连通块都求一棵生成树,因为任意一个简单环都可以又一条非树边和树上的一段路径组成,考虑枚举非树边并判断即可。

例如上图,环①可以由树上路径 5−2−4−6−75-2-4-6-752467 和非树边 5−75-757 组成;环②可以由树上路径 8−3−98-3-9839 和非树边 8−98-989 组成。

由于异或满足交换律,可以用树上前缀和 + LCA 快速取得某条树上路径的权值异或和。时间复杂度 O(nlog⁡n)O(n \log n)O(nlogn)

但其实还可以再优化,设 sis_isi 表示从根结点到 iii 的前缀和,在求 u−vu-vuv 路径的加法权值和时公式是 su+sv−2⋅slca(u,v)s_u + s_v-2\cdot s_{\text{lca(u,v)}}su+sv2slca(u,v)。但因为异或满足 x⊕x=0x \oplus x=0xx=0,所以在 su⊕svs_u \oplus s_vsusv1−lca(u,v)1-\text{lca}(u,v)1lca(u,v) 路径上的异或和就会被自动抵消掉!这样我们就无需求 LCA 了。时间复杂度可以做到 O(n+m)O(n+m)O(n+m)

在求生成树时只要拿一个 visvisvis 数组标记即可,注意特判自环的情况。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;vector<array<int, 2>> G[maxn];   // 邻接表:邻接节点,边权
int s[maxn], p[maxn];            // 到根节点的异或和、记录属于的连通块
bool vis[maxn];                  // 标记数组
set<array<int, 2>> treeE;        // 存储树边的有序对
int now;                         // 连通块计数器void dfs(int u, int fa){ // 求生成树+前缀异或和vis[u] = true;p[u] = now;for(auto [v, w] : G[u]){if(v == fa) continue;if(!vis[v]){treeE.insert({min(u, v), max(u, v)}); // 加入生成树中,存储时注意大小关系s[v] = s[u] ^ w;dfs(v, u);}}
}bool solve(){ // 在判断时采取的标准是:如果环不为0一定不行,直接返回;否则虽然当前行但不一定全部都行,继续检查int n, m;cin >> n >> m;// 初始化memset(vis, 0, sizeof(vis));memset(s, 0, sizeof(s));memset(p, 0, sizeof(p));treeE.clear();for(auto &u : G) u.clear();now = 0;vector<tuple<int, int, int>> E; // 存储所有原始边for(int i = 1; i <= m; i ++){int u, v, w; cin >> u >> v >> w;G[u].push_back({v, w}); G[v].push_back({u, w});E.emplace_back(u, v, w);}// 生成树+前缀异或和for(int u = 1; u <= n; u ++){if(!vis[u]){now ++; dfs(u, -1);}}// 检查所有非树边+统计答案for(auto [u, v, w] : E){if(u == v){ // 自环if(w != 0) return false;continue;}if(p[u] != p[v]) continue; // 不同连通块之间无需检查array<int, 2> e = {min(u, v), max(u, v)};if(!treeE.count(e)){ // 检查非树边if((s[u] ^ s[v]) != w) return false;}}return true;
}int main(){cin.tie(nullptr) -> ios::sync_with_stdio(false);int T; cin >> T;while(T --) cout << (solve()? "Yes" : "No") << "\n";return 0;
}

再给一份暴力找环就 AC 的代码:

int vis[55];
vector<array<int, 2>> G[55];bool dfs(int u, int val, int s){ // 当前遍历到u,异或值为val,起点为s时,判定是否正确for(auto [v, w] : G[u]){if(v == s && (val ^ w) != 0) return false; // 又回到自己了,且不为0if(vis[v]) continue;vis[v] = 1;if(!dfs(v, val ^ w, s)) return false;}return true;
}void solve()
{int n, m; cin >> n >> m;for(int i = 1; i <= m; i ++){int a, b, c; cin >> a >> b >> c;G[a].push_back({b, c}), G[b].push_back({a, c});}bool flag = true;for(int i = 1; i <= n; i ++){memset(vis, 0, sizeof vis);vis[i] = 1;flag &= dfs(i, 0, i);if(!flag) break;}cout << (flag? "Yes" : "No") << '\n';for(int i = 1; i <= n; i ++) G[i].clear(); // 清空!
}

当然也可以用什么带权并查集之类的做。(其实是我没调过)

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

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

相关文章

数据库优化提速(二)排序优化之搜索大数据酒店,进销存AI—仙盟创梦IDE

在 MySQL 数据库管理中&#xff0c;排序操作对于数据的有效展示和分析至关重要。本文将以一个实际的 SQL 查询为例&#xff0c;深入探讨排序优化方案&#xff0c;并结合进销存、酒店、知识库等大数据场景&#xff0c;阐述这些优化策略的应用价值。原始SELECT 应用编号, 应用序列…

Linux之Ansible自动化运维(二)

一、ansible Playbook应用由于服务器数量很多&#xff0c;配置信息比较多&#xff0c;因此可以利用Ansible Playbook编写任务自动化与流程化脚本Playbook 由一个或多个play组成的列表&#xff0c;play的主要功能Ansible中Task定义好的角色&#xff0c;指定剧本对应的服务器组二…

ArrayList线程不安全问题及解决方案详解

问题背景在多线程编程中&#xff0c;我们经常会遇到集合类的线程安全问题。Java中的ArrayList是一个常用的集合类&#xff0c;但它不是线程安全的。当多个线程同时操作同一个ArrayList实例时&#xff0c;可能会出现各种不可预料的问题。问题演示List<String> list new A…

车辆方向数据集 - 物体检测

关于数据集 包含超过50,000 张图像中具有方向的车辆的 50,000 多万个注释。它通过同时提供车辆类别和方向来减少对方向进行分类的辅助神经网络的需求。 预训练权重 我们将继续添加在车辆方向数据集和合成车辆方向数据集上训练的各种对象检测模型。如果您需要一些特定的预训练权…

Nextcloud搭建教程:使用Docker在腾讯云服务器上自建私人云盘

更多云服务器知识&#xff0c;尽在hostol.com你那百兆光纤的宽带。你是否也曾看着自己最珍贵的家庭照片、最私密的个人文档&#xff0c;静静地躺在某个科技巨头的服务器上&#xff0c;感到过一丝丝的不安&#xff1f;你的数据&#xff0c;到底被如何“阅读”和“分析”&#xf…

【操作记录】MNN Chat Android App 构建笔记(二)

&#x1f4d2; MNN Chat Android App 构建笔记 一、背景知识MNN 简介 MNN 是阿里开源的轻量级深度学习框架&#xff0c;支持 Android / iOS / Linux / Windows。提供推理、LLM、Vision、Audio 等模块。Android App 里用到的是 Java JNI 调用 MNN 库。CMake NDK 的作用 CMake&…

如何在 Axios 中处理多个 baseURL 而不造成混乱

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

AP服务发现PRS_SOMEIPSD_00255 的解析

[PRS_SOMEIPSD_00255 ] 「SOME/IP-SD头部的重启标志&#xff0c;对于重启后发出的所有报文&#xff0c;都应设置为 1&#xff0c;直至 SOME/IP头部中的会话 ID (Session-ID) 回绕并因此再次从 1 开始。在此回绕之后&#xff0c;重启标志应设置为 0。」(RS_SOMEIPSD_00006)核心含…

纯手撸一个RAG

纯手撸一个RAGRAG基本流程第一阶段&#xff1a;数据预处理&#xff08;索引&#xff09; - 构建知识库第二阶段&#xff1a;查询与生成&#xff08;推理&#xff09; - 回答问题总结Chunk介绍Chunk框架的介绍Chunk核心概念选择分块策略和框架如何选择分块框架Python代码实现第一…

视觉语言对比学习的发展史:从CLIP、BLIP、BLIP2、InstructBLIP(含MiniGPT4的详解)

前言 本文一开始是属于此文《图像生成(AI绘画)的发展史&#xff1a;从CLIP、BLIP、InstructBLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion(含ControlNet详解)》的&#xff0c;后独立成本文 第一部分 从CLIP、BLIP1、BLIP2到InstructBLIP 1.1 CLIP&#xff1a;基于对比文本…

HTTP代理与SOCKS代理的区别、应用场景与选择指南

在互联网日常使用与跨境业务中&#xff0c;HTTP代理 和 SOCKS代理 是两种常见的网络代理方式。无论是跨境电商、社交媒体账号运营、数据采集&#xff0c;还是科学访问海外资源&#xff0c;都需要选择合适的代理协议。什么是HTTP代理&#xff1f;定义HTTP代理 是基于 HTTP协议 的…

AI重塑职业教育:个性化学习计划提效率、VR实操模拟强技能,对接就业新路径

职业教育长期面临着一系列问题&#xff0c;包括“统一课程难以适配不同基础学员”、“实操反馈滞后”和“就业技能与企业需求脱节”等。随着人工智能技术的应用&#xff0c;这些传统教学模式正在发生变化。个性化技能培养得以实现&#xff0c;甚至可以提前识别学员的就业短板。…

主题配色下的背景透明度

用 CSS color-mix() 解决背景透明度的痛点 在设计卡片组件时&#xff0c;经常遇到这样的需求&#xff1a;卡片背景需要80%透明度&#xff0c;鼠标悬浮在内部某项时&#xff0c;修改背景色但保持同样的透明度。 问题场景 .card {background: rgba(59, 130, 246, 0.8); /* 蓝色80…

【Python代码】谷歌专利CSV处理函数

以下是一个重构后的高可用、可配置、低耦合的专利CSV处理函数&#xff0c;包含清晰的注释和结构&#xff1a; import csv import pandas as pd from datetime import datetime import os from typing import List, Dict, Any, Optional, Tuple import logging# 配置日志 loggin…

3-2〔OSCP ◈ 研记〕❘ WEB应用攻击▸WEB安全防护体系

郑重声明&#xff1a; 本文所有安全知识与技术&#xff0c;仅用于探讨、研究及学习&#xff0c;严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任&#xff0c;本人不承担任何责任。 如需转载&#xff0c;请注明出处且不得用于商业盈利。 …

PCIe 5.0相比顶级PCIe 4.0有何提升?

还在为PCIe 4.0固态硬盘那7000MB/s的速度沾沾自喜&#xff1f;醒醒&#xff0c;朋友。当很多人还在讨论PCIe 4.0是否“性能过剩”时&#xff0c;真正面向未来的PCIe 5.0已经带着碾压级的实力&#xff0c;来到了我们面前。这不是一次常规的“升级”&#xff0c;更不是英特尔式的…

23种设计模式——适配器模式(Adapter)​详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 设计模式 ✨特色专栏&#xff1a; 知识分享 &…

Vue3源码reactivity响应式篇之Reactive

概览 vue3中reactive用于将普通对象转换为响应式对象&#xff0c;它的实现原理是通过Proxy和Reflect来实现的。具体的实现文件参见packages\reactivity\src\reactive.ts。本文会介绍reactive的相关api如下&#xff1a; reactive&#xff1a;将普通对象转换为响应式对象readonly…

初识数据结构——Map和Set:哈希表与二叉搜索树的魔法对决

数据结构专栏 ⬅(click) 大家好&#xff01;我是你们的老朋友——想不明白的过度思考者&#xff01;今天我们要一起探索Java中两个神奇的数据结构&#xff1a;Map和Set&#xff01;准备好了吗&#xff1f;让我们开始这场魔法之旅吧&#xff01;&#x1f3a9; &#x1f3af; 先…

Unreal Engine UStaticMeshComponent

UnrealUnreal Engine - UStaticMeshComponent&#x1f3db; 定义&#x1f3db; 类继承⚡ 关键特性⚙️ 常见配置&#x1f6e0;️ 使用方法&#x1f4da; 在 C 中使用&#x1f4da; 在蓝图中使用&#x1f3ae; 典型应用场景&#x1f4da; 常见子类与用途&#x1f4dd; 小结Unrea…