问题

来源离散数学的图论中 第一个接触到的算法:Havel–Hakimi算法 (哈维尔算法)
判断一个非负序列是否为某无向简单图的度数列的方法(Pyhton代码)

前提提要

1.无向简单图

首先先了解什么是 无向简单图:因为在一个非负序列中,若它能形成无向简单图(没有方向,且在图中,两端点相同的边称为环;两端点间的若干条边称为平行边;有环的图称为带环图,没有环的图称为无环图;有平行边的图称为多重图;没有环也没有平行边的图,称为简单图)。

2.度数列

度数列:若把图 G 所有顶点的度数排成一个序列 S,则称 S 为图 G 的度数列。

3.握手定理

在离散数学中,判断一个非负序列是否为某无向简单图的度序列主要是根据其对应的图G中是否符合欧拉提出的握手定理:设D=<V,E>为任意有向图,V={v1,v2,…,vn},|E|=q,则所有顶点的度数和=2q,且出度=入度=q。握手定理的推论: 任何图(无向的或有向的)中,奇度顶点的个数是偶数。所有顶点的度数和(2q=偶数)=偶度顶点的度数之和(偶数)+奇度点的顶点度数之和,所以偶度顶点的顶点度数之和是一个偶数,而奇数个奇数为奇数,故奇数点的个数必为偶数。
所以根据上文的推论,即是判断度数列是否能成图的原理,相当于其能成图所需要的性质。

算法思路:

思路其实很简单:算法主要分三步:
1.排序(由大到小)。
2.删除(或置零)度序列中最大的(即第一个数)数 K ,且使后面的K个数都 -1。
ps:个人认为置零处理写代码更方便,“使后面的K个数都 -1”这个操作不会超出序列(Python列表)的总长度
3.若处理后的度数列中出现了负数,则不能成图,若度数列中数字都为0(因为是降序排序,则相当于第一个数不为0即可),则可以成无向最简图。

例如(递归循环处理):

度数列(2,3,2,1,4)
第一次处理(三步走)
1.排序之后:4 3 2 2 1
2.置0:第一个数K(K=4),将后面K(K=4)个数都 -1 即:0 2 1 1 0
3.判断:无负数,第一个数也不为0,也就进入下一次处理
第二次处理
1.排序之后:2 1 1 0 0
2.置0:第一个数K(K=2),将后面K(K=2)个数都 -1 即: 0 0 0 0 0
3.判断:第一个数为0(即全为0),则可成无向最简图。

AC python代码:

list = []  # 生产空列表
n=int(input('请输入正整数度序列个数:'))  # 度序列数字个数
for _ in range(n):list.append(int(input()))  # 向列表list(度序列)输入数字 每输入一个数字按一次回车
def havel(list):list.sort(reverse=True)  # 生成降序度序列if list[0] == 0:  # 递归终止条件:当排好序后,第一个数为0,因为是降序,则一定全为0,则可以成为最无向简图return Truei = 1  # 跳过序列中第一个数while i <= list[0]:  # 从第二个数(脚标为1)开始,向后的N个数字都-1(N为第一个数数值 (list[0]))list[i] -= 1if list[i] < 0:  # 如果出现负数,则不能成为最无向简图return Falsei += 1  # +1向下一个数循环list[0] = 0  # 减完之后第一个数0(相当于删除)if havel(list):  # 递归 再进行相同的下n次操作return Trueelse:return False
x= havel(list)  # 实现算法Havel–Hakimi自定义函数返回的bool值
print(x) #True 即可成图,False 不可成图

Havel–Hakimi算法学习笔记(哈维尔算法)详细【Python】相关推荐

  1. 机器学习入门 —— 超级详细的KNN算法学习笔记、KNN算法的三要素、KNN算法的优缺点

    文章目录 KNN(K nearest neighbors) K值的选择和影响 k取值偏小 k取值偏大 样本点距离的计算方式 闵可夫斯基距离 曼哈顿距离 欧几里得距离 切比雪夫距离 余弦距离 决策函数的 ...

  2. 【算法学习笔记】19.算法设计初步 最大子列和问题的几种方法

    第一种就是纯粹的暴力枚举起始.终点. O(n^3) 第二种在第一种的基础上先进行初始化,将以第一个元素为起点,所有元素为终点的所有子列和存储在S数组中,所以在第三层循环中计算子列和是直接用S[j]-S ...

  3. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  4. GMM高斯混合模型学习笔记(EM算法求解)

    提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...

  5. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  6. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  7. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  8. 算法学习笔记:对指定金额计算最少钞票数

    算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...

  9. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  10. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

最新文章

  1. centos7安装JDK1.7
  2. python3.6.8卸载_Mac 卸载 彻底删除 自己下载的 python 3
  3. mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失
  4. 解决中文乱码的问题要考虑的8个地方|(utf-8,用于抛砖引玉)
  5. Windows 64位下安装Redis超详细教程
  6. 1月22日发布!疑似渠道商泄露荣耀V40价格:3999元起?
  7. 融媒体需要什么计算机软件,融媒体时代对编辑的能力要求
  8. python 东方财富接口_东方财富 股票数据接口_
  9. 删除Docker出现: device or resource busy错误
  10. Asp.net Web Api开发Help Page配置和扩展
  11. gets和puts基本用法。
  12. 常用的图像质量评估方法
  13. 最全工业以太网通讯协议
  14. Linux USB 驱动开发—— 热插拔
  15. 超市信息管理程序c语言购物车,c语言购物车代码
  16. visual assist 小番茄常用设置
  17. 图解MIT-BIH数据库心电数据下载和Matlab读取程序
  18. win8 桌面显示计算机图标怎么删除,win8系统桌面图标显示快捷方式箭头怎么删除...
  19. python 鱼骨图_python面向对象编程,鱼骨图分析法
  20. [Python] 如何证明两组样本有显著性差异(t-test假设检验)

热门文章

  1. (Error -6311) PRSC module failed to write to a register. 问题的探讨
  2. android 11.0 12.0app安装黑名单(限制app安装)
  3. Markdown支持的emoji图标
  4. Helm 创建一个NOTES.txt文件
  5. html页面在ie上不兼容,四招解决IE 11浏览器网页不兼容问题
  6. Idea打字变成繁体
  7. 面向对象编程小项目,语音播报计算器
  8. 嵌入式linux环境取得U盘容量等信息的方法
  9. 假设知道服务器IP,如何查询它绑定的域名?
  10. 基于Python的模拟人脑神经元进行学习