算法分析(推理过程)

  • 首先,我们很容易通过握手定理(所以点的度数加起来是偶数)知道,对应的度序列是否可图化。
  • 在确定了可图化之后。但是担心会出现不可简单图化的情况。
  • 我们只需要对于这种可能进行讨论就好了。
  • 在可图化,但是不可简单图化的这种图中,就是因为会出现一些点上,一定会出现环(或者重边)的情况
  • 所以,我们只需要确定了一个固定的顺序,这样就可以解决掉这里重边的情况。(在操作系统中,关于解决死锁的时候,也用了类似的一个解决方案来破掉死锁的条件之一 —— 循环等待)。然后只允许前面的点与后面的点来构建边,在这样的边建立完成之后,就不允许反过来的操作(这样就避免重边 情况)
  • 所以,关键还是在环路的这种情况上。有环是怎么一回事呢?就是在前面的点,在合理的与(顺序在其后面的)点相连之后,任然剩下度没有能解决掉。这样的剩下来的度,岂不就是必须由环来提供。所以,只需要保证这样的点不存在就好了。
  • 注意,这里我们使用了前面已知的有序性。(这里有序性就直接用度的有序性来做就好了(从大到小))
  • 保证了上面的有序性还有一个作用,因为度大的点更有可能满足条件。。(否则会出现负的情况)。
  • 证明到这里,其实已经可以确定了上面的算法是可以确定一个充分条件,至于是不是必要条件,这个似乎还有待考究。
  • 而仔细再推理一下,就会发现,其实这其实也是一个必要条件
  • 因为,出现矛盾的情况,就是通过上面的排好序之后再选出来,结果判断的是不可简单图化,但是我们可以找到一个简单图来描述。因为用排好序之后,顺着减的话,减的都是在每一轮中比较大的那些。如果这些比较大的点最后都是出现了不能瞒住的情况,那么后面的用随机选点来减的这种情况就更不可能实现了。(注意这个逻辑

C++代码实现

核心代码:

int *a, N;
bool Havel() {for (int i = N - 1; i >= 0; --i) {sort(a, a + i+1); // sort the listif (!a[i]) break;for (int j = i - 1; j >= 0 && a[i]; j--) {a[j]--; a[i] --;if (a[j] < 0) return false;}if (a[i] > 0) return false; // 任然有剩余}return true;
}

解释:

  • 在上面的算法中,用系统自带的排序。默认是从小到大来排序,所以,上面都是从后面来数的。
  • 第一个判断: if (!a[i]) break; 表示,目前剩下的所有点的度都是0(在输入的时候就保证了所有度都是大于等于0的)
  • 之后的for循环会最大的那些点都做处理,一直到a[i] == 0为止。
  • 一旦出现了减完之后,后面的某些点变成了负数了,那么说明就一定有问题了。否则就是可以继续。
  • 但是结束之后剩余还有度数的话,就说明必有环了。 if (a[i] > 0) return false; // 任然有剩余
#include <iostream>
using namespace std;
#include <algorithm>
int *a, N;
bool Havel() {for (int i = N - 1; i >= 0; --i) {sort(a, a + i+1); // sort the listif (!a[i]) break;for (int j = i - 1; j >= 0 && a[i]; j--) {a[j]--; a[i] --;if (a[j] < 0) return false;}if (a[i] > 0) return false; // 任然有剩余}return true;
}
int main() {cin >> N;_ASSERT(N > 0);a = new int[N];int temp = 0; bool gama = true;for (int i = 0; i < N; ++i) {cin >> a[i]; gama &= (a[i] >= 0);temp += a[i];}if (!gama || temp % 2 || temp <= 0)cout << false<< endl;else cout << Havel() << endl;delete[] a;system("pause");
}

可简单图化算法(Havel算法)相关推荐

  1. 离散数学实验-01 可简单图化,连通图和欧拉图的判断(利用Fleury算法输出欧拉回路)

    离散数学的实验 实验要求 给定一非负整数序列(例如:(4,2,2,2,2)). 判断此非负整数序列是否是可图化的,是否是可简单图化的. 如果是可简单图化的,根据Havel定理过程求出对应的简单图,并输 ...

  2. 什么是计算机系统的可信基点,基于可信基点的结构化签名比较算法.pdf

    基于可信基点的结构化签名比较算法.pdf 第28卷 第24期 计算机工程与设计 21)07年12月 VO1.28 NO.24 Computer Engineering and Design Dec.2 ...

  3. 【数据挖掘】数据挖掘算法 组件化思想 示例分析 ( 组件化思想 | Apriori 算法 | K-means 算法 | ID3 算法 )

    文章目录 一. 数据挖掘算法组件化思想 二. Apriori 算法 ( 关联分析算法 ) 三. K-means 算法 ( 聚类分析算法 ) 四. ID3 算法 ( 决策树算法 ) 一. 数据挖掘算法组 ...

  4. 【转】直线光栅化算法-Bresenham算法

    [转]直线光栅化算法-Bresenham算法 https://blog.csdn.net/cjw_soledad/article/details/78886117 posted on 2019-03- ...

  5. Havel算法-Python实现

    Havel算法: (1)对序列从大到小进行排序 (2)设最大的度数为t,把最大的度数置0,然后把最大度数后(不包括自己)的t个度数分别减1 (就是把度数最大的点与后几个点进行连接) (3) - 如果序 ...

  6. 转(havel 算法)

    http://www.cnblogs.com/wally/p/3281361.html poj 1659(havel算法) 题目链接:http://poj.org/problem?id=1659 思路 ...

  7. 掌握一种基本图形元素光栅化算法,利用OpenGL实现直线光栅化的DDA算法。

    一.任务描述 根据下面要求,在右侧修改代码,绘制出预期输出的图片.平台会对你编写的代码进行测试. 1.本关任务 掌握一种基本图形元素光栅化算法,利用OpenGL实现直线光栅化的DDA算法. 2.预期输 ...

  8. python实现dfa过滤算法_Hopcroft算法DFA最小化Python实现

    DFA最小化原理 所谓自动机的化简问题即是对任何一个确定有限自动机DFA M,构造另一个确定有限自动机DFA M',有L(M)=L(M'),并且M'的状态个数不多于M的状态个数,而且可以肯定地说,能够 ...

  9. CRUSH:可控、可扩展的复本数据非中心化的定位算法

    摘要 快速兴起的分布式存储系统正面临着在数以千计的存储设备之间分配PB级的数据问题.在这样的系统中,需要将数据与负载分布,以充分利用可用的资源,并最大化系统的性能,同时能够适应系统的增长,管理硬件设备 ...

最新文章

  1. Linux下Postfix的配置和使用
  2. 第五届全国大学生计算机系统能力培养大赛 | 赠书
  3. 模仿android谷歌地图功能开发记录
  4. 2021年春季学期-信号与系统-第十三次作业参考答案-第三小题
  5. 自然语言处理「迷惑行为大赏」
  6. mariadb CTE示例
  7. ubuntu 14.04 安装chrome及给chromium 安装 flash player
  8. 【 Grey Hack 】反向Shell
  9. 统计通话次数和时间的软件_通话时间统计app下载|通话时间统计安卓版下载 v1.0.3 - 跑跑车安卓网...
  10. 挖掘建模-分类与预测-决策树
  11. hive 增加表字段语录_Hive改表结构的两个坑|避坑指南
  12. [ 转载 ] Java线程面试题 Top 50 (转载)
  13. leetcodepython_LeetCode 答案(python)1-17
  14. Eclipse中关闭不需要的插件
  15. java项目关联关系_Mybatis一对多关联关系映射实现过程解析
  16. Interview Experience in Singapore(Part Ⅲ)
  17. 转贴:操盘手心理训练手册
  18. windows10使用mklink命令给C盘软件搬家
  19. 第0课【课前准备】Keil安装 ISP程序下载
  20. android显示emoji,android兼容emoji显示以及检测是否支持emoji

热门文章

  1. MVC、MVP、MVVM,我到底该怎么选?
  2. 简单介绍tomcat中maxThreads,acceptCount,connectionTimeout
  3. JS组件系列——封装自己的JS组件,你也可以
  4. wxWidgets第九课 wx绘图工具
  5. 会员系统中需要验证用户的邮箱是否真实存在
  6. 使用Mybatis的Generator可能导致的一个错误
  7. Linux下MySQL链接被防火墙阻止
  8. python处理时间加减
  9. STM32的can现场总线实验心得
  10. RHCE笔记1-安裝