python实现无向图中环查找的Tarjan算法代码

时间: 2023-09-07 14:04:19 浏览: 137
### 回答1: ```python class Tarjan: def __init__(self, graph): self.graph = graph self.index = 0 self.stack = [] self.visited = [False for _ in range(graph.num_vertices)] self.indices = [-1 for _ in range(graph.num_vertices)] self.low_link_values = [-1 for _ in range(graph.num_vertices)] self.on_stack = [False for _ in range(graph.num_vertices)] self.scc = [] def is_cyclic(self): for vertex in range(self.graph.num_vertices): if not self.visited[vertex]: self.strongconnect(vertex) return any(len(x) > 1 for x in self.scc) def strongconnect(self, vertex): self.visited[vertex] = True self.indices[vertex] = self.index self.low_link_values[vertex] = self.index self.index += 1 self.stack.append(vertex) self.on_stack[vertex] = True for neighbor in self.graph.get_adjacent_vertices(vertex): if not self.visited[neighbor]: self.strongconnect(neighbor) self.low_link_values[vertex] = min(self.low_link_values[vertex], self.low_link_values[neighbor]) elif self.on_stack[neighbor]: self.low_link_values[vertex] = min(self.low_link_values[vertex], self.indices[neighbor]) if self.low_link_values[vertex] == self.indices[vertex]: scc = set() while True: w = self.stack.pop() self.on_stack[w] = False scc.add(w) if w == vertex: break self.scc.append(scc) ``` 上面是Tarjan算法查找无向图中环的Python代码。使用时,需要传入一个图对象,然后调用is_cyclic()方法,如果返回值为True,则说明图中存在环。 注意,这段代码需要图数据结构的支持,图的实现可以自己实现或者使用第三方库如networkx。 ### 回答2: Tarjan算法是一种强连通分量算法,可以用于在无向图中查找环。下面是用Python实现Tarjan算法的代码: ```python class Graph: def __init__(self, num_vertices): self.num_vertices = num_vertices self.adj_list = [[] for _ in range(num_vertices)] self.visited = [False] * num_vertices self.low = [0] * num_vertices self.ids = [0] * num_vertices self.id = 0 self.result = [] def add_edge(self, u, v): self.adj_list[u].append(v) self.adj_list[v].append(u) def tarjan(self, v, parent): self.visited[v] = True self.low[v] = self.ids[v] = self.id self.id += 1 for neighbor in self.adj_list[v]: if neighbor == parent: continue if not self.visited[neighbor]: self.tarjan(neighbor, v) self.low[v] = min(self.low[neighbor], self.low[v]) if self.low[neighbor] > self.ids[v]: self.result.append((v, neighbor)) else: self.low[v] = min(self.low[v], self.ids[neighbor]) def find_cycles(self): for i in range(self.num_vertices): if not self.visited[i]: self.tarjan(i, -1) if len(self.result) == 0: print('The graph does not contain any cycles.') else: print('The cycles in the graph are:') for cycle in self.result: print(cycle) g = Graph(5) g.add_edge(0, 1) g.add_edge(1, 2) g.add_edge(2, 3) g.add_edge(3, 0) g.add_edge(2, 4) g.find_cycles() ``` 以上代码实现了一个`Graph`类,包含了添加边、Tarjan算法等功能。通过调用`find_cycles`方法可以找到给定无向图中的所有环。在测试代码中,创建了一个包含5个顶点的无向图,并添加了若干条边。通过调用`find_cycles`方法,将打印出图中的所有环。如果图中不包含任何环,则会打印出相应的提示信息。 ### 回答3: Tarjan算法是一种用于查找无向图中环的强大算法。它通过遍历图中的每个节点,深度优先搜索子节点,并利用栈来维护当前遍历路径的节点。具体的Python实现如下: ```python class Graph: def __init__(self, vertices): self.V = vertices self.adj = [[] for _ in range(vertices)] self.Index = [-1] * vertices self.Lowlink = [-1] * vertices self.OnStack = [False] * vertices self.stack = [] self.count = 0 def addEdge(self, u, v): self.adj[u].append(v) self.adj[v].append(u) def tarjan(self, u, parent): self.Index[u] = self.count self.Lowlink[u] = self.count self.count += 1 self.stack.append(u) self.OnStack[u] = True for v in self.adj[u]: if v == parent: continue if self.Index[v] == -1: self.tarjan(v, u) self.Lowlink[u] = min(self.Lowlink[u], self.Lowlink[v]) elif self.OnStack[v]: self.Lowlink[u] = min(self.Lowlink[u], self.Index[v]) if self.Lowlink[u] == self.Index[u]: w = -1 while w != u: w = self.stack.pop() self.OnStack[w] = False print(w, end=" ") print() def findCycle(self): for i in range(self.V): if self.Index[i] == -1: self.tarjan(i, -1) # 测试样例 g = Graph(5) g.addEdge(1, 0) g.addEdge(0, 2) g.addEdge(2, 1) g.addEdge(0, 3) g.addEdge(3, 4) print("无向图中的环为:") g.findCycle() ``` 这段代码首先定义了一个Graph类来表示无向图,其中包括图的顶点数和邻接列表。在tarjan函数中,使用了Index、Lowlink和OnStack列表来记录每个节点的索引、最低链接值以及是否在栈中。遍历节点时,使用递归进行深度优先搜索,并根据Index和Lowlink值来判断是否找到环。在findCycle函数中,遍历图中的每个节点,对没有被访问过的节点调用tarjan函数进行环的查找。最后的测试样例中,创建了一幅无向图,然后调用findCycle函数查找环,并输出结果。 希望这段代码能够帮助你理解Python实现的Tarjan算法,并在无向图中查找环的过程中能够起到指导作用。

相关推荐

最新推荐

recommend-type

智慧酒店项目智能化系统汇报方案qy.pptx

智慧酒店项目智能化系统汇报方案qy.pptx
recommend-type

基于C语言编写的高并发Epoll服务器.zip

基于C语言编写的高并发Epoll服务器.zip
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

Redis验证与连接:快速连接Redis服务器指南

![Redis验证与连接:快速连接Redis服务器指南](https://img-blog.csdnimg.cn/20200905155530592.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTg5NTEw,size_16,color_FFFFFF,t_70) # 1. Redis验证与连接概述 Redis是一个开源的、内存中的数据结构存储系统,它使用键值对来存储数据。为了确保数据的安全和完整性,Redis提供了多
recommend-type

gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker app:app 报错 ModuleNotFoundError: No module named 'geventwebsocket' ]

这个报错是因为在你的环境中没有安装 `geventwebsocket` 模块,可以使用下面的命令来安装: ``` pip install gevent-websocket ``` 安装完成后再次运行 `gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker app:app` 就不会出现这个报错了。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

Redis配置文件解读:实例解析redis.windows.conf

![Redis配置文件解读:实例解析redis.windows.conf](https://img-blog.csdn.net/20180726010513323?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmc1NzI2Njg1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) # 1. Redis配置文件概述 Redis配置文件是Redis服务器运行的配置文件,它包含了Redis服务器的各种配置参数。通过修改Redis配置文件,我们可以对Redis服务器的运行行为进行
recommend-type

用js写一个冒泡排序)

好的,下面是 JavaScript 冒泡排序的代码: ```javascript function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len - 1; i++) { for (var j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j + 1]) { var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; }