深度优先搜索的拓扑排序python

本文仅对算法进行实现,原理可百度

import pandas as pd
from collections import defaultdict


# 拓扑排序类
class Graph:
    # 使用邻接链表的形式初始化图和总顶点数
    def __init__(self, v_num):
        self.graph = defaultdict(list)
        self.v = v_num

    # 添加边,记录每个顶点的邻接顶点
    def addEdge(self, u, v):
        self.graph[u].append(v)

    # 使用基于深度优先搜索的拓扑排序解决
    def topological_recursive(self, ver, visited, stack):
        # 标记当前顶点为已访问
        visited[ver] = True
        # 对当前顶点的所有邻接顶点中,访问未访问过的顶点
        for i in self.graph[ver]:
            if visited[i] == False:
                self.topological_recursive(i, visited, stack)
        # 当搜索回溯时,将当前顶点插入到栈
        stack.insert(0, ver)

    # 拓扑排序控制
    def topological_sorting(self):
        # 标记数组
        visited = [False] * self.v
        stack = []
        # 对每个顶点都要访问,以对多个连通分量时仍能访问
        for i in range(self.v):
            # 当前顶点未访问时,继续搜索
            if visited[i] == False:
                self.topological_recursive(i, visited, stack)
        # 结果输出
        self.print_class(stack)

    def print_class(self, stack):
        # 需要安排的课程
        course = ['高等数学', '程序设计', '离散数学', '数据结构', '编译原理', '操作系统', '计算机组成原理']

        for i in range(len(stack)):
            if i % 2 == 0:
                if i == 0: print('第', (i // 2) + 1, '学期: ', end='')
                else: print('\n第', (i // 2) + 1, '学期: ', end='')
            print(course[stack[i]], end='  ')

# 拓扑排序
def topological_sort(graph):
    length = len(graph)

    tpgl = Graph(length)
    # 边的添加
    for i in range(len(graph)):
        for j in range(len(graph)):
            if graph[i][j] == True:
                tpgl.addEdge(i, j)
    tpgl.topological_sorting()


def main():
    graph = [
        [False, False, True, False, False, False, False],
        [False, False, False, True, True, False, True],
        [False, False, False, True, False, False, False],
        [False, False, False, False, True, True, False],
        [False, False, False, False, False, False, False],
        [False, False, False, False, False, False, False],
        [False, False, False, False, False, True, False]
    ]
    topological_sort(graph)


if __name__ == '__main__':
    main()
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 4,292评论 0 3
  • 概述及标签体系搭建 1 概述 随着信息技术的迅速发展和信息内容的日益增长,“信息过载”问题愈来愈严重,愈发带来很大...
    JinkeyAI阅读 23,190评论 10 241
  • www.dlworld.cn 听说你了解深度学习最常用的学习算法:Adam优化算法?-深度学习世界深度学习常常需要...
    hzyido阅读 56,444评论 0 24
  • 曾经告诉你 不要有太多抱怨 也不该把一切都归诸生活 谁想 时光匆匆流过 我也开始用迷惑的眼光看着这个世界 这其中的...
    北汐暖栀阅读 3,093评论 2 8
  • 上午还是很乖的坐在电脑前,整理计划表,改简历,还听了几个挺有趣的微课,吸收一些很基础又碎片化的知识,听听他人的经历...
    豆钉阅读 1,625评论 0 0

友情链接更多精彩内容