Python 图(Graph)数据结构(一):图的构造与遍历(深度优先 DFS 和广度优先 BFS)

1. 图

图是一种复杂的数据结构,因为图中可能存在多对多的关系。
图 G 由顶点集 V 和边集 E 组成,记为 G=(V,E),其中 V 表示图 G 中顶点的有限非空集;E 表示图 G 中顶点之间的关系(边)的集合。图还可以分为有向图和无向图。

2. 有向图的构造和遍历

class MyDirectedGraph:
    def __init__(self, data=None):
        self.vertex = []
        self.edge = {}
        if data:
            for pair in data:
                from_node = pair[0]
                to_node = pair[1]
                edge_weight = pair[2]
                if from_node not in self.vertex:
                    self.vertex.append(from_node)
                if to_node not in self.vertex:
                    self.vertex.append(to_node)
                if from_node in self.edge:
                    self.edge[from_node].append([to_node, edge_weight])
                else:
                    self.edge[from_node] = [[to_node, edge_weight]]

    def _valid(self, v):
        return v in self.vertex

    def is_empty(self):
        return len(self.vertex) == 0

    def vertex_num(self):
        return len(self.vertex)

    def edge_num(self):
        res = 0
        for key, value in self.edge.items():
            res += len(value)
        return res

    def vertices(self):
        return self.vertex

    def edges(self):
        res = []
        for key in self.edge:
            edge_list = self.edge[key]
            for i in range(len(edge_list)):
                item = [key] + edge_list[i]
                res.append(item)
        return res

    def add_vertex(self, v):
        if v not in self.vertex:
            self.vertex.append(v)
        else:
            raise ValueError('Node has been in graph!')

    def add_edge(self, v1, v2, w):
        if self._valid(v1) and self._valid(v2):
            if v1 in self.edge:
                edge_list = self.edge[v1]
                for i in range(len(edge_list)):
                    if edge_list[i][0] == v2:
                        edge_list[i][2] = w
                        return
                edge_list.append([v2, w])
            else:
                self.edge[v1] = [[v2, w]]
        else:
            raise ValueError('Node not in graph!')

    def get_edge(self, v1, v2):
        if self._valid(v1) and self._valid(v2):
            if v1 in self.edge:
                edge_list = self.edge[v1]
                for i in range(len(edge_list)):
                    if edge_list[i][0] == v2:
                        return edge_list[i]
                return None
            else:
                return None
        else:
            raise ValueError('Node not in graph!')

    def out_edge(self, v):
        if self._valid(v):
            if v in self.edge:
                return self.edge[v]
            else:
                return []
        else:
            raise ValueError('Node not in graph!')

    def degree(self, v):
        if self._valid(v):
            if v in self.edge:
                return len(self.edge[v])
            else:
                return 0
        else:
            raise ValueError('Node not in graph!')

    def dfs_recursive(self, v):
        if self._valid(v):
            visited = set()
            result = []
            def helper(node):
                if node not in visited:
                    visited.add(node)
                    result.append(node)
                    node_edge_list = self.out_edge(node)
                    for edge in node_edge_list:
                        helper(edge[0])
            helper(v)
            rest = []
            for node in self.vertices():
                if node not in visited:
                    rest.append(node)
            if rest:
                rest.sort(key=lambda rest_node: len(self.out_edge(rest_node)), reverse=True)
            for rest_node in rest:
                helper(rest_node)
            return result
   
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值