无向图DFS、BFS生成树,ABC251F
目录一、题目1、题目描述2、输入输出2.1输入2.2输出3、原题链接二、解题报告1、思路分析2、复杂度3、代码详解一、题目1、题目描述2、输入输出2.1输入2.2输出3、原题链接https://atcoder.jp/contests/abc251/tasks/abc251_f二、解题报告1、思路分析这题就是DFS、BFS生成树的裸题对于无向图1、DFS生成树会囊括所有的横叉边2、BFS生成树会囊括所有的返祖边这两个性质均可以通过反证法证明1、假设存在 横叉边u, v dfn[u] dfn[v]不在DFS生成树上那么说明搜索到 u 的时候 v已经被搜了这与 dfn[u] dfn[v] 矛盾故原命题成立2、假设存在 返祖边u, v dep[u] dep[v] 1不在DFS生成树上那么说明搜索到 u 的时候 v已经被搜了这与 dep[u] dep[v] 1 矛盾故原命题成立所以对于两种要求的生成树分别dfs和bfs即可2、复杂度时间复杂度 O(N)空间复杂度O(N)3、代码详解#include bits/stdc.h namespace ranges std::ranges; namespace views std::views; using i64 long long; using u32 unsigned; using u64 unsigned long long; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, M; std::cin N M; std::vectorstd::vectorint adj(N); for (int i 0; i M; i) { int u, v; std::cin u v; --u; --v; adj[u].push_back(v); adj[v].push_back(u); } std::vectorstd::arrayint, 2 ans; std::vectorbool vis(N); [](this auto self, int u) - void { vis[u] true; for (int v : adj[u]) { if (vis[v]) { continue; } ans.push_back(std::arrayint, 2{u, v}); self(v); } }(0); for (auto [u, v] : ans) { std::cout u 1 v 1 \n; } assert(ans.size() 1 N); std::queueint q; ans.clear(); q.push(0); vis[0] false; while (!q.empty()) { int u q.front(); q.pop(); for (int v : adj[u]) { if (vis[v]) { ans.push_back(std::arrayint, 2{u, v}); vis[v] false; q.push(v); } } } assert(ans.size() 1 N); for (auto [u, v] : ans) { std::cout u 1 v 1 \n; } return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2410417.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!