博客
关于我
2019秦皇岛CCPC F.Forest Program(DFS找环)
阅读量:747 次
发布时间:2019-03-22

本文共 1593 字,大约阅读时间需要 5 分钟。

关于将图变成森林的思路与实现

在图论中,我们常常需要对图进行编辑,使其满足特定条件。本文将重点讨论如何通过删除图中的边,将一个无向图转换成一片森林。具体来说,我们需要确保删除后的图中每个连通块都是一棵树,即无环且没有自环。

分析与思路

首先,需要理解原图的结构特点。假设给定的图是无向图,满足以下条件:

  • 没有多重边。
  • 存在至少一个简单环。
  • 没有自环。

我们的目标是通过删除一些边,使该图变为一片森林。为此,我们需要解决如何处理环状结构,以及如何管理非环边。

每个环都需要至少删除一条边才能消除环。因此,对于一个环,边的数量为c,我们至少需要删除c条边中的一条。这个问题类似于集合论中的反馈问题,因此贡献为2^c - 1。这是因为对于c条边中的每一条都可能被删除,剩下的边最多可以保留c条。

对于非环边,也就是不属于任何环的边,它们的删除或保留都不会影响是否形成一个森林。对于这些边,每一条都有两种选择:保留或删除。因此,贡献为2^num,其中num是非环边的总数。

针对图的具体处理

  • 环的识别与处理

    要有效地处理环,我们可以使用DFS(深度优先搜索)来遍历图。每当我们从一个未访问的节点开始遍历时,递增计数器记录所经历的环的数量。

  • 边分类与计算

    • 环上的边:每个环至少需要删除一条边。对于每个环,假设边数量为c,贡献为2^c - 1。
    • 非环边:对于非环边,假设总数为num,每条边可以保留或删除,贡献为2^num。
  • 数学计算

    总贡献为:2^(m - cnt) * (2^cnt - 1),其中m是总边数,cnt是环边的总数(注意:这里的cnt应根据环的数量和每个环的边数动态计算)。

  • 实现细节

    进行DFS时,可以维护一个计数器记录当前访问层数。如果在某一步返回时发现当前节点已经被访问过,但不是通过父节点访问的,就表示这里存在环。我们需要记录所有环的数量。

  • 代码实现

    以下是使用C++语言实现该思路的代码框架:

    #include 
    #include
    using namespace std;typedef long long ll;const int N = 1e6 + 5;const ll mod = 998244353;vector
    e[N]; // 边的邻接表int vis[N]; // 记录访问状态ll ans;int n, m, num; // n为节点数,m为边数,num为非环边数ll qpow(ll a, ll b) { ll res = 1; a %= mod; while (b > 0) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res;}void dfs(int now, int x, int f) { vis[x] = now; for (int it : e[x]) { if (it == f) continue; if (!vis[it]) { dfs(now + 1, it, x); } else if (vis[it] < now) { // 表示环存在 // 递增cnt cnt++; } }}

    总结

    将图转换成森林的关键在于处理环的边以及非环边。通过DFS遍历图,识别环并统计环的数量。对于每个环,至少删除一条边,贡献为2^c - 1。对于非环边,每条边可以选择保留或删除,贡献为2^num。最终的答案可以通过合并这些贡献计算得出。

    转载地址:http://luhwk.baihongyu.com/

    你可能感兴趣的文章
    Python 和 OpenCV.如何检测图像中的所有(填充)圆形/圆形对象?
    查看>>
    Python 和 RabbitMQ - 聆听来自多个渠道的消费事件的最佳方式?
    查看>>
    python编辑器打不开_关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路...
    查看>>
    python编译exe同时支持32位_第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe...
    查看>>
    Python 和Java 哪个更适合做自动化测试?
    查看>>
    Python编程:掌握高级语言程序设计。从零基础到精通,收藏这篇就够了!
    查看>>
    python 图片转ico
    查看>>
    python 图片转文字、语音转文字、文字转语音保存音频并朗读
    查看>>
    python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
    查看>>
    Python 在并行进程之间共享字典
    查看>>
    Python 垃圾收集器文档
    查看>>
    python 基于 wordcloud + jieba + matplotlib 生成词云
    查看>>
    python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
    查看>>
    Python编程:Tkinter图形界面设计(2)
    查看>>
    Python 基础 - Day 5 Learning Note - 模块 之 标准库:time (1)
    查看>>
    Python 基础一
    查看>>
    python 基础操作知识整理总结
    查看>>
    Python 基础知识点整理与分享,期盼你的交流!
    查看>>
    python 基础第七篇
    查看>>
    Python编程:Tkinter图形界面设计(1)
    查看>>