图论入门编程

卡码网刷题链接:98. 所有可达路径

一、题目简述

二、编程demo

方法①邻接矩阵

python 复制代码
from collections import defaultdict
#简历邻接矩阵
def build_graph(): 
    n, m = map(int,input().split()) 
    graph = [[0 for _ in range(n+1)] for _ in range(n+1)]
    for _ in range(m): 
        i,j = map(int,input().split()) 
        graph[i][j] = 1
    return graph,n
#深度优先搜索
def dfs(g,r,i,end,path):
    if i == end:
        r.append(path.copy())
        return 
    for k in range(1,end+1):
        if g[i][k]:
            path.append(k)
            dfs(g,r,k,end,path)
            path.pop()
    return 
#主函数
def main():
    graph,n = build_graph()
    result = []
    path = [1]
    dfs(graph,result,1,n,path)
    #按格式打印输出
    if not result:
        print(-1)
    for p in result:
        print(" ".join(map(str,p)))
    return 
if __name__ == "__main__":
    main()

方法②邻接表

python 复制代码
from collections import defaultdict
def build_graph(): 
    n, m = map(int,input().split()) 
    graph = defaultdict(list) 
    for _ in range(m): 
        i,j = map(int,input().split()) 
        graph[i].append(j)
    return graph,n

def dfs(g,r,i,end,path):
    if i == end:
        r.append(path.copy())
        return 
    for k in g[i]:
        path.append(k)
        dfs(g,r,k,end,path)
        path.pop()
    return 

def main():
    graph,n = build_graph()
    result = []
    path = [1]
    dfs(graph,result,1,n,path)
    if not result:
        print(-1)
    for p in result:
        print(" ".join(map(str,p)))
    return 
if __name__ == "__main__":
    main()
相关推荐
robin_suli8 分钟前
穷举vs暴搜vs深搜vs回溯vs剪枝系列一>字母大小写全排列
算法·剪枝·深度优先遍历·回溯
在西湖雾雨中起舞1 小时前
P9748 [CSP-J 2023] 小苹果
算法
海海不掉头发1 小时前
【 算法设计与分析-回顾算法知识点】福建师范大学数学与计算机科学学院 2006 — 2007学年第二学期考试 A 卷
算法·期末复习
太阳照常升起3662 小时前
机试准备第一天
算法
Non importa2 小时前
【初阶数据结构】线性表之单链表
数据结构·考研·算法·链表·github·学习方法
fanstuck3 小时前
如何快速准备数学建模?
算法·数学建模·数据挖掘
Static_Xiao3 小时前
C语言导航 7.1函数的概念与定义
c语言·数据结构·算法
萌の鱼3 小时前
leetcode 53. 最大子数组和
数据结构·c++·算法·leetcode
水水阿水水3 小时前
第二章:面向对象之封装(一)
开发语言·c++·算法
圆圆滚滚小企鹅。3 小时前
刷题记录 回溯算法-5:17.电话号码的字母组合
数据结构·python·算法·leetcode