首页 > 编程语言 >数据结构与算法-图

数据结构与算法-图

时间:2024-06-04 17:34:00浏览次数:29  
标签:graph self add dfs 算法 edge visited 数据结构

图是由顶点(vertex)和边(edge)组成的一种数据结构。顶点代表图中的节点,边代表节点之间的关系。

图可以分为有向图(directed graph)和无向图(undirected graph)。有向图中的边有一个方向,而无向图中的边没有方向。

常见的图算法包括广度优先搜索(BFS)、深度优先搜索(DFS)、拓扑排序(topological sorting)、最短路径算法(如Dijkstra算法和Floyd-Warshall算法)等。

图的表示方法有邻接矩阵(adjacency matrix)和邻接表(adjacency list)两种常见的形式。邻接矩阵用一个二维数组表示图中顶点之间的连接关系,邻接表则用一个数组加上链表的形式表示。

图在实际中的应用非常广泛,比如社交网络中的好友关系可以用图来表示,地图上的城市和道路可以用图来描述。掌握图的数据结构和常用的算法对解决各类问题非常有帮助。

from collections import defaultdict

class Graph:
    def __init__(self):
        self.graph = defaultdict(list)
    
    def add_edge(self, u, v):
        self.graph[u].append(v)
        self.graph[v].append(u)
    
    def dfs(self, v, visited):
        visited[v] = True
        print(v, end=' ')
        
        for i in self.graph[v]:
            if not visited[i]:
                self.dfs(i, visited)
    
    def dfs_traversal(self, start):
        visited = [False] * len(self.graph)
        self.dfs(start, visited)

# 创建一个Graph对象
g = Graph()
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 2)
g.add_edge(2, 3)
g.add_edge(3, 4)

print("深度优先搜索结果:")
g.dfs_traversal(0)

在这段代码中,我们首先定义了一个Graph类来表示无向图。通过调用add_edge方法来添加图中的边,然后使用dfs方法来进行深度优先搜索,并使用dfs_traversal方法来遍历整个图。

在示例代码中,我们创建了一个简单的无向图,并从顶点0开始进行深度优先搜索。输出的结果就是深度优先搜索的顺序。

标签:graph,self,add,dfs,算法,edge,visited,数据结构
From: https://blog.csdn.net/Xxy_1008/article/details/139449174

相关文章

  • 代码随想录算法训练营第四十六天|动态规划:完全背包理论基础、518.零钱兑换II、377. 组
    动态规划:完全背包理论基础文档讲解:代码随想录题目链接:52.携带研究材料(第七期模拟笔试)完全背包有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总......
  • 代码随想录算法训练营第四十九天| 139.单词拆分、多重背包
    139.单词拆分文档讲解:代码随想录题目链接:.-力扣(LeetCode)第一想法: 非空字符串s:背包非空单词的列表wordDict:物品每个物品可以使用多次,是一个完全背包问题看到这道题目的时候,大家应该回想起我们之前讲解回溯法专题的时候,讲过的一道题目回溯算法:分割回文串 (opens......
  • 代码随想录算法训练营第四十八天| 70. 爬楼梯(进阶版)、322. 零钱兑换、 279.完全平方数
     70.爬楼梯(进阶版)文档讲解:代码随想录题目链接:57.爬楼梯(第八期模拟笔试)我们之前做的爬楼梯是只能至多爬两个台阶。这次改为:一步一个台阶,两个台阶,三个台阶,.......,直到m个台阶。问有多少种不同的方法可以爬到楼顶呢?这又有难度了,这其实是一个完全背包问题。1阶,2阶,.........
  • 数据结构·栈和队列
    栈栈(Stack):只允许在一端插入或删除的线性表栈顶:线性表允许进行插入或删除的那一端栈底:固定的,不允许进行插入和删除的另一端特点:是受限的线性表,拥有线性关系;后进先出LIFO顺序栈使用顺序存储,自底向上存储数据元素,指针指向栈顶元素的位置操作s.top=-1;......
  • 数据结构·线性表
    线性表一、逻辑结构和基本操作1.逻辑结构具有相同数据类型的n个数据元素的有限序列,表长n,n=0为空表表头:第一个元素表尾:最后一个元素除第一个元素外,每个元素有且仅有一个直接前驱除最后一个元素外,每个元素有且仅有一个直接后继2.基本操作initList(&L);len(L);locateE......
  • 数据结构·简述
    数据结构绪论一、数据结构:相互存在一种或多种特定关系的集合结构:任何问题,数据元素不孤立存在,之间存在关系逻辑结构存储结构(物理结构)数据的运算逻辑结构和存储结构密不可分算法设计取决于逻辑结构,实现依赖存储结构二、逻辑结构:数据元素之间的逻辑关系与存储无关,独立于......
  • 数据结构·基本概念
    DataStructureNotesAuthor:"blueflylabor"Version:1.0RefreshDate2020.11.26Description:JustrecordandreviewsomepointsaboutDataStructure.Havemistakesthatpleasecorrectityourself.数据结构的基本概念1.数据2.数据元素:数据的基本单位,一个......
  • 数据结构·查找算法
    查找1.顺序查找一般表(1)代码typedefstruct{ElemType*elem;inttableLen;}SSTable;intsearchSeq(SSTableST,ElemTypekey){ST.elem[e]=key;//设置哨兵for(inti=0;i<ST.tableLen;i++)returni;//存在返回,不存在返回1}(2)设......
  • 数据结构·查找算法
    查找1.顺序查找一般表(1)代码typedefstruct{ElemType*elem;inttableLen;}SSTable;intsearchSeq(SSTableST,ElemTypekey){ST.elem[e]=key;//设置哨兵for(inti=0;i<ST.tableLen;i++)returni;//存在返回,不存在返回1}(2)设......
  • 基于Java+Dijkstra算法的地铁线路换乘最短路径项目(免费提供全部源码)
    下载地址如下:基于Java+Dijkstra算法的地铁线路换乘最短路径项目(免费提供全部源码)资源-CSDN文库项目介绍背景随着城市化进程的不断推进,地铁已成为现代大城市公共交通系统的核心组成部分。地铁线路的日益复杂和站点的不断增加,使得乘客在出行时面临换乘路线选择的困扰。为了提......