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->欧拉回路
- 在②的前提下,深度优先搜索,找出一笔画的路径并输出
三、源代码
import numpy as np
from random import randint
'''函数功能:完成邻接矩阵的初始化'''
def init():n,m=eval(input("请输入图的结点数和边数(逗号隔开):"))matrix = np.zeros((n, n), dtype=int) #图的邻接矩阵m_list=(input("请输入有关联关系的两个结点1,3(每一对中间用空格隔开):例如 1,5 1,6 在无向图中表示结点1和节点5、6是相互可达的\n")).split(' ')for i in m_list: #根据用户的输入,完成邻接矩阵的初始化matrix[eval(i[0])-1,eval(i[-1])-1]=1;matrix[eval(i[-1])-1, eval(i[0])-1] = 1; #无向图的邻接矩阵是对称的 减去1是为了与矩阵的下标对应return matrix,n'''函数功能:求可达性矩阵'''
def GetReachableMatrix(A,n): #参数A:邻接矩阵 参数n:结点个数temp = np.array(A, dtype=int)C=np.zeros((n,n),dtype=int) #B是可达性矩阵for i in range(n):C+=temptemp=np.dot(temp,A)t=np.array(C,dtype=bool)B=np.array(t,dtype=int)return B'''函数功能:通过邻接矩阵获取到每一个节点的度数,在保证连通性的前提下,通过奇数度节点直接判别出欧拉路or欧拉回路'''
def GetOddDegree(matrix,n):count=0 #表示奇数度的大小for i in range(n):sum=0for j in range(n):sum+=matrix[i][j]if sum%2 !=0:# 说明是奇数count+=1return count''' 函数功能:由邻接矩阵求出一个字典:每一个节点 映射 相邻节点 '''
def GetGraph(matrix,n):graph=dict() #生成一个空字典for i in range(n):graph["v"+str(i+1)]=list()#映射的对象是一个列表for j in range(n):if matrix[i][j]==1:#向列表中添加邻接节点graph["v"+str(i+1)].append("v"+str(j+1))return graphdef DFS(graph,start): #参数 graph是邻接节点的一个字典 参数start是起始点stack=[] #当栈用seen=set() #创建一个集合,查重用(判断这条路是否已经走过)+记录路径的作用print("一笔画路径为:",end="")stack.append(start)seen.add(start)while (len(stack)>0):vertx=stack.pop() #默认是从栈顶取出node=graph[vertx]for i in node:if i not in seen:#确保之前没有走过该节点stack.append(i)seen.add(i)print(vertx+"->",end="")print("\b\b")if __name__=='__main__':matrix,Node=init() #initial infotemplateMatrix=np.ones((Node,Node),dtype=int) #连通性阵的可达性矩阵的模板 全是1 用于比较ReachhableMatrix=GetReachableMatrix(matrix,Node) #求可达性矩阵graph=GetGraph(matrix,Node) #得到每一个节点的邻接节点构成的字典dictr=randint(0,Node)print("邻接矩矩阵为:\n",matrix)if (templateMatrix==ReachhableMatrix).all():if GetOddDegree(matrix,Node)==0:#奇数度节点为0个,说明是欧拉图DFS(graph, "v"+str(Node))print("是欧拉图-->可以一笔画")elif GetOddDegree(matrix,Node):DFS(graph, "v"+str(Node))print("是半欧拉图-->可以一笔画")else:print("既不是欧拉路,也不是欧拉回路-->不能一笔画")else: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
Python实现---南邮离散数学实验四:图的生成及欧拉(回)路的确定相关推荐
- 南邮数据结构实验三---图的基本运算及飞机换乘次数最少问题
一. 实验目的和要求 1.掌握在图的邻接矩阵和邻接表存储结构实现图的基本运算的算法.学习使用图算法解决应用问题的方法. (1). 验证教材中关于在邻接矩阵和邻接表两种不同存储结构上实现图的基本运算的算 ...
- 南邮 | 离散数学实验二:集合上二元关系性质判定的实现
题目:根据某一集合元素以及关系矩阵,判断其满足什么特性,输出满足的特性,再求此集合的闭包. 举例:以集合{1,2,3,4}为例.关系矩阵为:[[1,0,1,0],[0,1,0,0],[1,0,1,1] ...
- 南邮计算机实验报告合集【非常全】
南邮计算机实验报告合集 GitHub上自取,可以借鉴,请勿直接抄袭 南京邮电大学数据结构实验,南京邮电大学离散数学实验,南京邮电大学操作系统实验,南京邮电大学电工电子基础实验B实验,南京邮电大学汇编语 ...
- 南邮matlab实验报告,南邮matlab实验报告.doc
南邮matlab实验报告 软件课程设计 实验报告 模块名称:__MATLAB_____________ 专业班级:__ __________ 姓 名:__ _____________ 学 号:__ _ ...
- C语言南邮数据结构实验报告2,南邮数据结构实验报告.docx
南邮数据结构实验报告 实验报告 课程名称 实验名称数据结构二叉树基本操作以及哈夫曼编码译码系统 实验时间 指导单位指导教师年月日 学生姓名 学院(系) 班级学号专业 二叉树的基本运算: 一.问题描述 ...
- python实训报告pygame_20181218 实验四《Python程序设计》实验报告
20181218 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1812 姓名: 学号:20181218 实验教师:王志强 ...
- 离散数学实验题目-图
离散数学实验报告 计算机科学与技术系 目录 第一章 实验概述 3 1.1 实验目的 3 1.2 实验内容 3 1.3 实验环境 3 第二章 实验原理和实现过程 4 2.1 实验原理 4 2.2 实验过 ...
- 南邮java实验报告,南邮微机原理实验报告精选.doc
南邮微机原理实验报告精选 <微型计算机原理与接口技术> 上机实验 学 院: 电子科学与工程 专 业: 电磁场与无线技术 姓 名: 陈秀慧 课 程 号: B0300062S 学 号: 任课老 ...
- matlab数学实验 南邮,matlab实验练习题(计算机)-南邮-matlab-数学实验大作业答案
matlab实验练习题(计算机)-南邮-matlab-数学实验大作业答案 1"MATLAB"练习题练习题要求:抄题.写出操作命令.运行结果,并根据要求,贴上运行图.1.求的所有根. ...
最新文章
- CentOS 7.4下Redis及集群的安装及配置
- docker-compose bug
- 1.1 基础-取近似值
- Android 抽屉布局
- ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析
- UIImagePickerController按钮的中文问题
- MinIO Client完全指南 ​​​​​​​
- .net core精彩实例分享 -- 文件与I/O
- 【渝粤教育】国家开放大学2018年春季 3818-21T燃气工程施工 参考试题
- Docker JDK镜像
- 机器学习(六)——PCA降维处理
- 读书笔记 大前研一《专业主义》
- 机器视觉中的常用打光方式(明场照明,暗场照明)
- 织梦会员中心注册登录
- linux-C 重定向句柄操作(dup,duo2,dup3)详解及demo
- rtklib-单点定位(pntpos.c)代码关键问题解析-satposs部分
- 华为云 CDN金秋特惠活动,这价可以
- 网络营销实训一:什么是网络营销?
- 1011: 圆柱体表面积 Java
- 说起安全,阿里云总裁胡晓明为何愤懑又自信?