如何判断一个度数数列能否构成简单图

基于“Havel Hakimi”算法的判断是否构成简单图的方法

第一步

观察度数为奇数的数列是不是偶数个,例如2,3,3,1这个数列的度数为奇数的数有奇数个,不能构成简单图

如果满足进入第二步

第二步

数列中有n个元素,则度数最大值不能超过n-1,例如1,3,这样的数列就无法构成简单图

如果满足进入第三步

第三步

首先将S={d1,d2,d3,d4,...,dn}进行降序排序

然后删除第一个元素,即最大的元素d[i],然后对后面的前d[i]个元素都减去一,以此递归下去

如果最后的数都是零的话,就可以构成简单图,如果出现负数或度数大于剩余点数的个数即无法构成简单图

例子

例如 1 1 1 2 3.

观察度数为奇数的有1,1,1,3 有四个,满足第一步

观察最大度数为3,小于5-1,故满足第二步

将数列降序排列 3 2 1 1 1

删去最大元素3,剩下的前3个元素减一,得到 1 0 0 1

再重新排序

1 1 0 0 

删去最大元素1 剩下的前1个减去一,得到 0 0 0

故都是零向量,所以是简单图

再例如1, 2,3,4,5,5

同理前两步判断这个数列也满足

进行第三步

先排序

5,5,4,3,2,1

删去最大元素5,剩下的前5个元素减去一,得到4,3,2,1,0

排序后 删去最大元素4,剩下的前4个元素减去一, 2,1,0,-1 出现负数,故无法构成简单图

你可能感兴趣的:(算法,数据结构,c语言)