python实现基本数据结构第四篇(图:字典存储,邻接矩阵存储,邻接表存储)

本文探讨了如何在Python中存储图这种数据结构,包括使用字典、邻接矩阵和邻接链表三种方式,并展示了每种方式的运行结果。通过这些方法,可以有效地表示和操作图中的多对多关系。
摘要由CSDN通过智能技术生成

图是比树更复杂的一种数据结构。图中各个数据元素之间存在着多对多的关系,实际上日常生活中大部分关系都是图的关系,很多关系交错在一起就组成了一个规模很大的图,既然图这么重要,那么现在我们就谈谈如何在计算机中存储图这种数据元素存在多对多关系的数据结构。

当然,图分为无向图和有向图,至于基本概念,度娘里有很多,这里就不多赘述了。
图的字典形式存储python实现:
图中的每个顶点,都是字典中的键,和该顶点有边相连的顶点列表,就是该键的值。

class Graph():
    def __init__(self):
        nodelist = list(map(str,input('请输入图中的结点,以空格分开:').split(' ')))
        self.graph = {
   }
        for node in nodelist:
            flag = True
            node_bian = list(map(str,input('请输入以%s为起始点的边的终端点,没有边用"#"代替:' %node).split(' ')))
            if "#" in node_bian:
                self.graph[node] = []
            else:
                for i in node_bian:
                    if i not in nodelist:
                        flag = False
                        print('输入的终端结点中有结点不是图中的结点,请重新创建图。')
                        break
                self.graph[node] = node_bian
                if flag == False:
                    break

    def print_Graph(self):
        '''
        打印图
        :return:
        '''
        for i, j in self.graph.items():
            print('%s:%s' % (i, j))


    def generatePath(self,graph,path,end,results):
        '''
        构建指定路径
        :param graph: Graph
        :param path: list
        :param end: string
        :param results: list
        :return:list
        '''
        self.graph = graph
        state = path[-1]
        if state == end:
            results.append(path)
        else:
            for arc in self.graph[state]:
                if arc not in path:
                    self.generatePath(graph, path + [arc], end, results)


    def searchGraph(self,graph,start,end):
        '''
        从图中找出指定路径
        :param graph: Graph
        :param start: string
        :param end: string
        :return: list
        '''
        self.graph = graph
        results = []
        self.generatePath(self.graph, [start], end, results)  # 生成路径
        results.sort(key=lambda x: len(x))  # 按路径长短排序
        return results

    def print_all_path(self):
        '''
        输入指定起始点和终止点,在图中寻找和构建路径
        :return:
        '''
        start_node,end_node = map(str,input('请输入要查询的起始点和终止点(以空格分开):').split(' '))
        r = self.searchGraph(self.graph,start_node,end_node)
        print("********* %s -------> %s 的所有路径 ************" %(start_node,end_node))
        for i in r:
            print(i)
        print("##################\n共计%d条路径" %len(r))
        for j in r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值