离散数学——通俗易懂的描述:可图化,可简单图画

一.基础知识部分

1可图化与可简单图画的定义

2.判断可图化的充要条件:

其实简单一句话就是:所有度数总和为偶数,就是可图化的,反之也成立

如果还不理解就直接看例子

3.判断可简单图化的充要条件(总共有两种办法:Havel定理和埃尔德什定理):

(1)Havel定理

看不懂的话就接看例子理解,然后下一张图片有我总结的步骤,按照步骤会判断就行

接下来是一些例题

步骤:(1)先判断度数之和是否为偶数,即判断是否可图化

           (2)使用Havel定理,即判断是否可简单图化

               注意:使用定理过程中,若出现 1.其中一个点度数为负数  or   2.最大度数>剩下的点数

                          则可判断不可简单图画

(2)埃尔德什定理

看不懂的话就接看例子理解,然后下一张图片有我总结的步骤,按照步骤会判断就行

接下来是一些例题

步骤:(1)判断 最大度数 小于等于 n-1?

                     判断 最小度数 大于等于 0?

           (2)判断度数之和是否为偶数,即判断是否可图化

           (3)使用埃尔德什定理,即判断是否可简单图化

红色笔是步骤一;绿色笔是第二步;黄色笔是第三步

二.代码实现

1.Havel定理(解析都在注释里面了,只要看懂上面内容就肯定看得懂代码)

bool Havel_Hakimi(int arr[]){  
    for(int i=0; i<n-1; ++i)
		{  
			sort(arr+i,arr+n);// 从第i个元素开始进行排序 
			if(i+arr[i] > n-1) return false;//若第i个元素+arr[i]的值超过n-1,那么不可简单图化
			for(int j=i+1; j<=i+arr[i] ; ++j)//如果没有超过n-1,进入循环
				{  
				--arr[j];  
					if(arr[j] < 0) return false;  //若出现负数,那么也不可简单化
				}  
		}  
    if(arr[n-1]!=0) return false;  //若到最后,最小度数不等于0,也不可简单化
    return true;  

2.埃尔德什定理(用c语言进行测试,总是判断不对,我就用的python)

def is_graphical(sequence):
    max_degree = max(sequence)
    min_degree = min(sequence)
    total_sum = sum(sequence)

    n = len(sequence)
    if max_degree > n - 1 or min_degree < 0 or total_sum % 2 != 0:
        return False  # 不可图化

    return True  # 可图化


def is_simple_graphical(sequence):
    sorted_sequence = sorted(sequence, reverse=True)
    n = len(sorted_sequence)

    prefix_sum = [0] * n
    for i in range(n):
        prefix_sum[i] = prefix_sum[i - 1] + sorted_sequence[i]

    if sum(sorted_sequence) % 2 != 0:
        return False  # 序列之和为奇数,不可简单图化

    while True:
        if sorted_sequence[0] < 0 or sorted_sequence[0] >= n:
            return False  # 最大度数不在有效范围内,不可简单图化

        for i in range(1, sorted_sequence[0] + 1):
            sorted_sequence[i] -= 1

        sorted_sequence[0] = 0
        sorted_sequence.sort(reverse=True)

        count = sum(1 for degree in sorted_sequence if degree == 0)

        if count == n:
            return True  # 所有度数都为 0,可简单图化

        if sorted_sequence[0] < 0:
            return False  # 存在负数,不可简单图化


if __name__ == "__main__":
    sequence = list(map(int, input("请输入非负整数序列,以空格分隔(例如:2 2 1 1): ").split()))

    if not sequence:
        print("输入错误!")
    else:
        if is_graphical(sequence):
            print("非负整数序列是可图化的。")
            if is_simple_graphical(sequence):
                print("非负整数序列是可简单图化的。")
            else:
                print("非负整数序列不是可简单图化的。")
        else:
            print("非负整数序列不是可图化的。")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值