图的遍历——DFS与BFS

本文探讨了图的遍历方法,包括无向图的邻接矩阵存储结构,详细介绍了深度优先遍历(DFS)和广度优先遍历(BFS)的原理,并给出了相应的代码实现及测试数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的遍历

图的遍历 ( T r a v e r s i n g   G r a p b ) (Traversing\ Grapb ) (Traversing Grapb):从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历 。

无向图的邻接矩阵储存结构代码

class Undirected_Graph_Matrix(object):
#Adjacency Matrix
    def __init__(self, vertices=[], edges_list=[]):                 
        self.edges_dict = {}                                        #{(tail, head):weight}
        self.edges_list=edges_list                                  #(tail, head, weight)
        self.vertices = vertices                                    #顶点
        self.num_edges = len(self.edges_list)                       #边的数目
        self.num_vertices = len(self.vertices)                      #顶点数目
        self.Mat = zeros((self.num_vertices,self.num_vertices))     #邻接矩阵
        
        if len(self.vertices) == 0:
        #图不能为空
            print('图不能为空')
            raise IndexError

        for Edge in edges_list:
        #根据edges_list生成self.edges_dict
            self.edges_dict[(Edge[0],Edge[1])]=Edge[2]
        
        for i in range(self.num_vertices):
            for j in range(self.num_vertices):
                if i==j:
                    self.Mat[i][j]=0
                elif (vertices[i],vertices[j]) in self.edges_dict:
                    self.Mat[i][j]=self.edges_dict[(vertices[i],vertices[j])]
                    self.Mat[j][i]=self.edges_dict[(vertices[i],vertices[j])]
                elif (vertices[j],vertices[i]) in self.edges_dict:
                    self.Mat[i][j]=self.edges_dict[(vertices[j],vertices[i])]
                    self.Mat[j][j]=self.edges_dict[(vertices[j],vertices[i])]
                else:
                    self.Mat[i][j]=inf
                    self.Mat[j][i]=inf

深度优先遍历

深度优先遍历 ( D e p t h _ F i r s t _ S e a r c h ) (Depth\_First\_Search) (Depth_First_Search),也有称为深度优先搜索,简称为 D F S DFS DFS,它从图中某个顶点 v v v出发,访问此顶点,然后从 v v v的未被访问的邻接点出发深度优先遍历图,直至图中所有和 v v v有路径相通的顶点都被访问到。

深度优先遍历代码

def DFS(G,i,Visited):
    Visited[i]=1
    print(G.vertices[i])
    for j in range(G.num_vertices):
        if 0<=G.Mat[i][j]<inf and Visited[j]==0 and i!=j:
            DFS(G,j,Visited)
            
def DFSTraverse(G):
    Visited=[0 for i in range(G.num_vertices)]
    for i in range(G.num_vertices):
        if Visited[i]==0:DFS(G,i,Visited)

广度优先遍历

广度优先遍历 ( B r e a d t h _ F i r s t _ S e a r c h ) (Breadth\_First\_ Search) (Breadth_First_Search),又称为广度优先搜索,简称 B F S BFS BFS,它从图中某个顶点 v v v出发,访问此顶点,接着对 v v v的所有邻接点进行访问,然后再对每个访问的顶点进行如 v v v般操作。

广度优先遍历代码

def BFS(G,List,Visited):    
    Q=[]
    for i in List:
        print(G.vertices[i])
        for j in range(i):
            if 0<=G.Mat[i][j]<inf and Visited[j]==0 and i!=j:
                Q.append(j)
                Visited[j]=1
    if Q:BFS(G,Q,Visited)

def BFSTraverse(G):
    Visited=[0 for i in range(G.num_vertices)]
    for i in range(G.num_vertices):
        if Visited[i]==0:
            Visited[i]=1
            BFS(G,[i],Visited)

DFS与BFS的完整代码以及测试数据

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 21 22:04:14 2019

@author: Administrator
"""
from numpy import *

class Undirected_Graph_Matrix(object):
#Adjacency Matrix
    def __init__(self, vertices=[], edges_list=[]):                 
        self.edges_dict = {}                                        #{(tail, head):weight}
        self.edges_list=edges_list                                  #(tail, head, weight)
        self.vertices = vertices                                    #顶点
        self.num_edges = len(self.edges_list)                       #边的数目
        self.num_vertices = len(self.vertices)                      #顶点数目
        self.Mat = zeros((self.num_vertices,self.num_vertices))     #邻接矩阵
        
        if len(self.vertices) == 0:
        #图不能为空
            print('图不能为空')
            raise IndexError

        for Edge in edges_list:
        #根据edges_list生成self.edges_dict
            self.edges_dict[(Edge[0],Edge[1])]=Edge[2]
        
        for i in range(self.num_vertices):
            for j in range(self.num_vertices):
                if i==j:
                    self.Mat[i][j]=0
                elif (vertices[i],vertices[j]) in self.edges_dict:
                    self.Mat[i][j]=self.edges_dict[(vertices[i],vertices[j])]
                    self.Mat[j][i]=self.edges_dict[(vertices[i],vertices[j])]
                elif (vertices[j],vertices[i]) in self.edges_dict:
                    self.Mat[i][j]=self.edges_dict[(vertices[j],vertices[i])]
                    self.Mat[j][j]=self.edges_dict[(vertices[j],vertices[i])]
                else:
                    self.Mat[i][j]=inf
                    self.Mat[j][i]=inf


    

def DFS(G,i,Visited):
    Visited[i]=1
    print(G.vertices[i])
    for j in range(G.num_vertices):
        if 0<=G.Mat[i][j]<inf and Visited[j]==0 and i!=j:
            DFS(G,j,Visited)
            
def DFSTraverse(G):
    Visited=[0 for i in range(G.num_vertices)]
    for i in range(G.num_vertices):
        if Visited[i]==0:DFS(G,i,Visited)
    

    
def BFS(G,List,Visited):    
    Q=[]
    for i in List:
        print(G.vertices[i])
        for j in range(i):
            if 0<=G.Mat[i][j]<inf and Visited[j]==0 and i!=j:
                Q.append(j)
                Visited[j]=1
    if Q:BFS(G,Q,Visited)

def BFSTraverse(G):
    Visited=[0 for i in range(G.num_vertices)]
    for i in range(G.num_vertices):
        if Visited[i]==0:
            Visited[i]=1
            BFS(G,[i],Visited)
    
    
vertices=['A','B','C','D','E','F','G','H','I']
edges_list=[['C','I',8],['A','B',10],['A','F',11],['B','C',18],['B','I',12],['B','G',16],['F','G',17],['F','E',26],['C','D',22],['I','D',21],['G','D',24],['G','H',19],['E','H',7],['H','D',16]]
G=Undirected_Graph_Matrix(vertices,edges_list)   
DFSTraverse(G)
print('.........................') 
BFSTraverse(G)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值