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

dfs判断有向图是否存在环

对于一个有向图判断是否存在环,不只可以使用拓扑排序,直接对整个图 dfs 也可以。但是 dfs 过程中的 vis 数组不能仅设置 "未经过"(0) 与 "已经过"(1) 两种状态,以 "再一次走到 '已经过' 标志" 为基准判环。因为再一次走到某个 "已经过" 状态时,可能是从两条不同的路线走到这一个地方的,并没有形成环(对拓扑来说相当于两条分叉路径汇集到同一个点)。因此,需要额外设置 "当前 dfs 路径已经过"(2) 这种状态。每个点在这三种状态之间切换,具体地:

  • 从未经过 \(\rightarrow\) 始终为 \(0\)
  • 第一次经过 \(\rightarrow\) 设置为 \(2\),启动该点的 dfs 过程
  • dfs 过程中未找到环,回溯时 \(\rightarrow\) 设置为 \(1\)

对于已经过的点不会再重复搜索,故总复杂度为 \(O(n + m)\)

例题:ABC456E

code:

def solve():n, m = MII()G = [[] for _ in range(n)]for _ in range(m):u, v = MII()u -= 1v -= 1G[u].append(v)G[v].append(u)W = II()s = [I() for _ in range(n)]# 状态标记:0=未访问,1=在栈中,2=已处理完成vis = [[False] * W for _ in range(n)]@bootstrapdef dfs(u, d):# print(u, d)"""返回是否找到环"""vis[u][d] = 1  # 标记在栈中nd = (d + 1) % W# 检查留在此城市if s[u][nd] == 'o':if vis[u][nd] == 1:  # 找到环yield Trueif vis[u][nd] == 0:res = yield dfs(u, nd)if res:yield True# 检查移动到邻居for v in G[u]:if s[v][nd] == 'o':if vis[v][nd] == 1:  # 找到环yield Trueif vis[v][nd] == 0:res = yield dfs(v, nd)if res:yield Truevis[u][d] = 2  # 标记为已处理yield False# 从所有 day 1 是假日的城市开始for i in range(n):if s[i][0] == 'o' and vis[i][0] == 0:if dfs(i, 0):print("Yes")returnprint("No")
http://www.jsqmd.com/news/743836/

相关文章:

  • Steam创意工坊下载难题的终极解决方案:WorkshopDL跨平台模组工具详解
  • 保姆级教程:给你的Ultralytics YOLOv8验证结果加上mAP75(附完整代码与权重调整探讨)
  • 如何快速掌握猫抓插件:新手用户的完整视频下载指南
  • 告别全局include:用SystemVerilog bind机制管理你的验证IP(VIP)与覆盖率收集点
  • 京东商品监控自动下单终极指南:三步实现智能抢购
  • NifSkope:如何免费编辑《上古卷轴》和《辐射》游戏3D模型?
  • 告别分类器!用Stable Diffusion的CFG Scale参数,手把手教你玩转AI绘画的细节与创意平衡
  • 90%成功率!大麦网自动抢票脚本的5个核心技术秘密
  • MetaClaw框架:实现LLM智能体的持续自我进化
  • 基于MCP协议构建智能多模式网页抓取服务器,赋能AI助手生态
  • 实了个验 A4 倒置显微镜 - 实了个验
  • 江西省 CPPM 报考(官网)SCMP 报名(中物联)双认证机构及联系方式 - 众智商学院课程中心
  • 从诊断会话到通信优化:深入理解UDS 0x10与0x83服务的黄金搭档工作流
  • FPGA在数据安全中的并行加密与动态重构优势
  • PDA5927光电管特性实测:为什么测光强要用短路电流而不是端电压?
  • 用安卓模拟器+旧版Fakelocation破解版,零成本搞定KEEP运动记录(附1.3.0.2版本下载)
  • 如何构建高效的大麦网自动抢票Python脚本:技术实现与优化指南
  • OpenDataArena:开源机器学习数据集评估平台解析
  • LinkSwift:八大网盘直链解析利器,告别下载限速的终极解决方案
  • ModOrganizer2虚拟文件系统与冲突管理完整解析:技术原理与实战指南
  • 避开F28335 ePWM的坑:死区、影子寄存器与同步触发配置详解
  • 2026衢州正规靠谱黄金上门回收选福正美,卖黄金找福正美 - 福正美黄金回收
  • NumPy计算范数时,axis和keepdims参数怎么用?一个例子讲清矩阵与向量处理的区别
  • OnionClaw:AI智能体自动化暗网情报收集工具箱实战指南
  • 基于Whisper API的ChatGPT语音输入插件开发与实战指南
  • 终极解决方案:LinkSwift如何彻底改变你的网盘下载体验
  • R3nzSkin国服换肤终极指南:3分钟解锁英雄联盟全皮肤
  • 2026不锈钢屏风大气造型设计与玄关隔断应用:佛山鼎钻钢业中式轻奢全覆盖 - 博客万
  • 开源搜索智能体OpenSeeker架构解析与应用实践
  • 深度解析:Jasminum如何实现高效的中文文献智能识别与管理解决方案