You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现读取文本文件数据的广度优先搜索(BFS)

BFS适配文本文件输入的实现方案

你当前的核心问题是文本输入的解析逻辑和实际输入格式不匹配:你存储输入的文本每行对应一条边的(起点u, 终点v),但你写的convert函数是按照邻接矩阵的逻辑做转换,和输入格式完全不契合。

你已经实现的Graph类不需要做任何修改,只需要调整输入解析逻辑,直接把读取到的每行两个值作为边传入addEdge方法即可直接适配。


完整可运行代码

from collections import defaultdict

class Graph:
    def __init__(self): 
        self.graph = defaultdict(list) 
    def addEdge(self,u,v):
        self.graph[u].append(v)
    def BFS(self, s):
        visited = [False] * (max(self.graph) + 1)
        queue = []
        queue.append(s)
        visited[s] = True
        while queue:       
            s = queue.pop(0)
            print (s, end = " ")         
            for i in self.graph[s]:
                if visited[i] == False:
                    queue.append(i)
                    visited[i] = True

# 读取文本文件部分(优化为with语法自动管理文件资源)
list_of_lists = []
with open("ajd.txt", "r") as data:
    for line in data.readlines():
        stripped_line = line.strip('\n')
        line_list = list(map(int, stripped_line.split(',')))
        list_of_lists.append(line_list)

# 初始化图并批量添加边
g = Graph()
for u, v in list_of_lists:
    g.addEdge(u, v)

# 调用BFS,可自行修改起始节点
g.BFS(1)

可选优化

如果你后续使用的节点编号不连续、存在较大间隔,可以修改BFS的visited实现为字典,避免不必要的空间浪费:

def BFS(self, s):
    visited = {}
    queue = []
    queue.append(s)
    visited[s] = True
    while queue:       
        s = queue.pop(0)
        print (s, end = " ")         
        for i in self.graph[s]:
            if i not in visited:
                queue.append(i)
                visited[i] = True

内容的提问来源于stack exchange,提问作者Cory Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:06:03