网络算法-图搜索算法DFS/BFS

一.DFS和BFS基本思想

1.DFS伪代码

// B=所有边界点构成的集合
B.Push(s);
WHILE B非空
    d=B.Pop();
    将d标记为“已探索”;
    FOR d的所有邻居t
        IF t的标记为“未探索”
            B.Push(t);
    ENDFOR
ENDWHILE

2.BFS伪代码

// B=所有边界点构成的集合
B.EnQueue(s);
WHILE B非空
    d=B.DeQueue();
    将d标记为“已探索”;
    FOR d的所有邻居t
        IF t的标记为“未探索”
            B.EnQueue(t);
    ENDFOR
ENDWHILE

二.代码实现DFS

1.DFS.py

import Graph
# 从文件中构图
def build_graph(file_path,graph):
    f = open(file_path,"r")
    for i in f.readlines():
        a,b =i.split()
        graph.insert(int(a),int(b))
    f.close()

# 寻找所有路径
def findpath(graph,startnode,destinationnode):
    visited={}  #创建一个字典,key值表示相应的结点,value值取0,1代表标记和未标记
    path=[]  #路径
    for i in graph.getnodes():  #所有结点初始化未标记
        visited[i]=0
    DFS(graph,visited,startnode,destinationnode,path)  # 调用DFS

# DFS
def DFS(graph,visited,v,destinationnode,path):
        visited[v]=1  # 标记为已访问
        path.append(v)  #加入path
        if v==destinationnode:  # 如果节点v是目的节点,那么输出此路径
            for i in range(len(path)):
                if i!=len(path)-1:
                    print(path[i],end="-")
                else:
                    print(path[i])
            path.pop(len(path) - 1)
            visited[v] = 0  #v是目标结点,将v从路径中弹出,并重新设置为未标记
        else:
            for m in graph.succ(v): #访问v的未探索的邻接结点,并进行DFS
                if visited[m]==0:
                 DFS(graph,visited,m,destinationnode,path)
            path.pop(len(path)-1)  #v的邻接结点全部被探索过,将v从路径中弹出
            visited[v]=0

2.Graph.py

class Graph(object):
    def __init__(self):
        self.nodes = []
        self.edges = {}

# 返回该节点的所有邻接节点(边)
    def succ(self, node):
        return self.edges[node]

# 返回节点个数
    def get_node_num(self):
        return len(self.nodes)

# 增加边
    def insert(self, node_a, node_b):
        if not(node_a in self.nodes):
            self.nodes.append(node_a)
            self.edges[node_a] = list()
        if not(node_b in self.nodes):
            self.nodes.append(node_b)
            self.edges[node_b] = list()
        if not(node_b in self.edges[node_a]):
            self.edges[node_a].append(node_b)
        if not(node_a in self.edges[node_b]):
            self.edges[node_b].append(node_a)
#获取点集
    def getnodes(self):
        return self.nodes

3.test.py

import Graph
import DFS
graph = Graph.Graph()
DFS.build_graph("test.txt", graph)
#print(graph.nodes) #输出结点
#print(graph.edges) #输出边
DFS.findpath(graph,1, 2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个编程的菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值