【生成樹+環】題解:P3907 環的異或_圖論_環_異或_搜索_算法競賽_C++

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

Link:Luogu - P3907

這里默認題目中指的環都是“簡單環”(即沒有“環套環”的情況)。

眾所周知,樹是圖的一種特殊情況,且一定無環。如果我們想要得到一個有環的復雜圖,有一種辦法是考慮先建一棵樹,然后不斷加入非樹邊。

那本題如果要“找環”,我們不妨把這個過程反過來。先對于原圖中每個連通塊都求一棵生成樹,因為任意一個簡單環都可以又一條非樹邊和樹上的一段路徑組成,考慮枚舉非樹邊并判斷即可。

例如上圖,環①可以由樹上路徑 5?2?4?6?75-2-4-6-75?2?4?6?7 和非樹邊 5?75-75?7 組成;環②可以由樹上路徑 8?3?98-3-98?3?9 和非樹邊 8?98-98?9 組成。

由于異或滿足交換律,可以用樹上前綴和 + LCA 快速取得某條樹上路徑的權值異或和。時間復雜度 O(nlog?n)O(n \log n)O(nlogn)

但其實還可以再優化,設 sis_isi? 表示從根結點到 iii 的前綴和,在求 u?vu-vu?v 路徑的加法權值和時公式是 su+sv?2?slca(u,v)s_u + s_v-2\cdot s_{\text{lca(u,v)}}su?+sv??2?slca(u,v)?。但因為異或滿足 x⊕x=0x \oplus x=0xx=0,所以在 su⊕svs_u \oplus s_vsu?sv?1?lca(u,v)1-\text{lca}(u,v)1?lca(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…