码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python实现---南邮离散数学实验四:图的生成及欧拉(回)路的确定


    一、题目要求:

    内容:

    对具有n个结点的无向图,判断其能否被一笔画。

    要求:

    对给定n个结点的无向图,进行欧拉图和半欧拉图的判定,若是欧拉图或半欧拉图,则输出所有的欧拉(回)路。

    二、实验原理及内容:

    所采用的数据结构:栈(通过python的列表类型pop来模拟)

    所采用的的存储结构:字典(存放某一个结点的所有相邻的结点)、集合set(去重+检测是否走过该节点)

    函数:

    • def init():
    '''函数功能:完成邻接矩阵的初始化'''
    
    • def GetReachableMatrix(A,n):  #参数A:邻接矩阵  参数n:结点个数
    '''函数功能:求可达性矩阵'''
    
    • def GetOddDegree(matrix,n):
    '''函数功能:通过邻接矩阵获取到每一个节点的度数,在保证连通性的前提下,通过奇数度节点直接判别出欧拉路or欧拉回路'''
    
    • def GetGraph(matrix,n):
    ''' 函数功能:由邻接矩阵求出一个字典:每一个节点 映射 相邻节点 '''
    
    • def DFS(graph,start):  #参数 graph是邻接节点的一个字典   参数start是起始点
    ''' 函数功能:通过dfs算法求出欧拉(回)路 '''
    
    时间复杂度:O(n²)
    
    实验思路:
    • 欧拉(回)路前提:可达性矩阵元素均为1
    • 若不满足1直接结束。若满足:求出奇数度节点的个数,等于2->欧拉路 等于0->欧拉回路
    • 在②的前提下,深度优先搜索,找出一笔画的路径并输出

    三、源代码

    1. import numpy as np
    2. from random import randint
    3. '''函数功能:完成邻接矩阵的初始化'''
    4. def init():
    5. n,m=eval(input("请输入图的结点数和边数(逗号隔开):"))
    6. matrix = np.zeros((n, n), dtype=int) #图的邻接矩阵
    7. m_list=(input("请输入有关联关系的两个结点1,3(每一对中间用空格隔开):例如 1,5 1,6 在无向图中表示结点1和节点5、6是相互可达的\n")).split(' ')
    8. for i in m_list: #根据用户的输入,完成邻接矩阵的初始化
    9. matrix[eval(i[0])-1,eval(i[-1])-1]=1;
    10. matrix[eval(i[-1])-1, eval(i[0])-1] = 1; #无向图的邻接矩阵是对称的 减去1是为了与矩阵的下标对应
    11. return matrix,n
    12. '''函数功能:求可达性矩阵'''
    13. def GetReachableMatrix(A,n): #参数A:邻接矩阵 参数n:结点个数
    14. temp = np.array(A, dtype=int)
    15. C=np.zeros((n,n),dtype=int) #B是可达性矩阵
    16. for i in range(n):
    17. C+=temp
    18. temp=np.dot(temp,A)
    19. t=np.array(C,dtype=bool)
    20. B=np.array(t,dtype=int)
    21. return B
    22. '''函数功能:通过邻接矩阵获取到每一个节点的度数,在保证连通性的前提下,通过奇数度节点直接判别出欧拉路or欧拉回路'''
    23. def GetOddDegree(matrix,n):
    24. count=0 #表示奇数度的大小
    25. for i in range(n):
    26. sum=0
    27. for j in range(n):
    28. sum+=matrix[i][j]
    29. if sum%2 !=0:# 说明是奇数
    30. count+=1
    31. return count
    32. ''' 函数功能:由邻接矩阵求出一个字典:每一个节点 映射 相邻节点 '''
    33. def GetGraph(matrix,n):
    34. graph=dict() #生成一个空字典
    35. for i in range(n):
    36. graph["v"+str(i+1)]=list()#映射的对象是一个列表
    37. for j in range(n):
    38. if matrix[i][j]==1:
    39. #向列表中添加邻接节点
    40. graph["v"+str(i+1)].append("v"+str(j+1))
    41. return graph
    42. def DFS(graph,start): #参数 graph是邻接节点的一个字典 参数start是起始点
    43. stack=[] #当栈用
    44. seen=set() #创建一个集合,查重用(判断这条路是否已经走过)+记录路径的作用
    45. print("一笔画路径为:",end="")
    46. stack.append(start)
    47. seen.add(start)
    48. while (len(stack)>0):
    49. vertx=stack.pop() #默认是从栈顶取出
    50. node=graph[vertx]
    51. for i in node:
    52. if i not in seen:#确保之前没有走过该节点
    53. stack.append(i)
    54. seen.add(i)
    55. print(vertx+"->",end="")
    56. print("\b\b")
    57. if __name__=='__main__':
    58. matrix,Node=init() #initial info
    59. templateMatrix=np.ones((Node,Node),dtype=int) #连通性阵的可达性矩阵的模板 全是1 用于比较
    60. ReachhableMatrix=GetReachableMatrix(matrix,Node) #求可达性矩阵
    61. graph=GetGraph(matrix,Node) #得到每一个节点的邻接节点构成的字典dict
    62. r=randint(0,Node)
    63. print("邻接矩矩阵为:\n",matrix)
    64. if (templateMatrix==ReachhableMatrix).all():
    65. if GetOddDegree(matrix,Node)==0:#奇数度节点为0个,说明是欧拉图
    66. DFS(graph, "v"+str(Node))
    67. print("是欧拉图-->可以一笔画")
    68. elif GetOddDegree(matrix,Node):
    69. DFS(graph, "v"+str(Node))
    70. print("是半欧拉图-->可以一笔画")
    71. else:
    72. print("既不是欧拉路,也不是欧拉回路-->不能一笔画")
    73. else:
    74. print("非连通图,既不是半欧拉图,也不是欧拉图-->不能一笔画")

    四、写在最后

    大一下还没有学dfs

            推荐一个b站的相关资源,快速上手bfs和dfs(用python)

    [Python] BFS和DFS算法(第3讲)—— 从BFS到Dijkstra算法_哔哩哔哩_bilibili从BFS到Dijkstra算法Dijkstra算法是BFS的升级版。当一个图中的每条边都加上权值后,BFS就没办法求一个点到另一个点的最短路径了。这时候,需要用到Dijkstra算法。从最基本原理上讲,把BFS改成Dijkstra算法,只需要把“队列”改成“优先队列”就可以了。这段视频主要给大家介绍BFS转Dijkstra的具体过程,包括优先队列的用法、代码实现。希望对大家有一定帮助。, 视频播放量 44702、弹幕量 633、点赞数 1175、投硬币枚数 1210、收藏人数 1260、转发人数 174, 视频作者 正月点灯笼, 作者简介 海外留学党一名,目前在新南威尔士大学读博,大家也可以认为我是无业游民。平时爱好讲讲课,录点教学视频。,相关视频:[Python] BFS和DFS算法(第1讲),[Python] BFS和DFS算法(第2讲),【neko】DFS与BFS【算法编程#5】,【算法】最短路径查找—Dijkstra算法,BFS广搜解决迷宫问题,图的存储(邻接表)与遍历(BFS),【算法】图的遍历—BFS和DFS,图Graph, 深度优先遍历(DFS), 广度优先遍历(BFS)【数据结构和算法入门9】,【北京大学】数据结构与算法Python版(完整版),DFS深搜与BFS广搜 C++代码详解https://www.bilibili.com/video/BV1ts41157Sy?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click

  • 相关阅读:
    windows优化原神
    Unity类银河恶魔城学习记录8-5 p81 Blackhole duration源代码
    Meta分析核心技术
    k8s高可用集群(一)
    arcgis插件 批量出图 按地块批量出图工具
    JVM系列一
    K8s in Action 阅读笔记——【12】Securing the Kubernetes API server
    【面试题】前端面试真题 年前端面试
    江西建筑模板厂家-能强优品木业
    SpringBoot电商项目实战Day7 堆
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/125530686
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号