热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何判断一个度序列能否构成简单图——哈维尔-哈基米算法的应用与解析

求一个度序列是否能组成一个简单的图|哈维尔-哈基米算法原文:https://www . geesforgeks . org/fi

求一个度序列是否能组成一个简单的图|哈维尔-哈基米算法

原文:https://www . geesforgeks . org/find-if-a-degree-sequence-can-form-a-simple-graph-Havel-hakimi-algorithm/

给定一个非负整数序列 arr[] ,任务是检查是否存在对应于这个度序列的简单图。注意简单图是没有自环和平行边的图。

示例:

输入: arr[] = {3,3,3,3}
输出:
这其实是一个完整的图(K 4

输入: arr[] = {3,2,1,0}
输出:
一个顶点的度数为 n-1,因此它与所有其他 n-1 个顶点相连。
但另一个顶点的度数为 0,即孤立。这是矛盾的。

方法:检查简单图形存在的一种方法是通过下面给出的哈维尔-哈基米算法:


  • 按非递增顺序对非负整数序列进行排序。

  • 删除第一个元素(比如 V)。从下一个 V 元素中减去 1。

  • 重复 1 和 2,直到满足其中一个停止条件。

停止条件:


  • 剩余的所有元素都等于 0(简单图形存在)。

  • 减法后遇到负数(不存在简单图)。

  • 减法步骤剩余的元素不足(不存在简单的图形)。

下面是上述方法的实现:

C++

// C++ implementation of the approach
#include
using namespace std;
// Function that returns true if
// a simple graph exists
bool graphExists(vector &a, int n)
{
    // Keep performing the operations until one
    // of the stopping condition is met
    while (1)
    {
        // Sort the list in non-decreasing order
        sort(a.begin(), a.end(), greater<>());
        // Check if all the elements are equal to 0
        if (a[0] == 0)
            return true;
        // Store the first element in a variable
        // and delete it from the list
        int v = a[0];
        a.erase(a.begin() + 0);
        // Check if enough elements
        // are present in the list
        if (v > a.size())
            return false;
        // Subtract first element from next v elements
        for (int i = 0; i         {
            a[i]--;
            // Check if negative element is
            // encountered after subtraction
            if (a[i] <0)
                return false;
        }
    }
}
// Driver Code
int main()
{
    vector a = {3, 3, 3, 3};
    int n = a.size();
    graphExists(a, n) ? cout <<"Yes" :
                        cout <<"NO" <    return 0;
}
// This code is contributed by
// sanjeev2552

Java 语言(一种计算机语言,尤用于创建网站)

// Java implementation of the approach
import java.util.*;
@SuppressWarnings("unchecked")
class GFG{
// Function that returns true if
// a simple graph exists
static boolean graphExists(ArrayList a, int n)
{
    // Keep performing the operations until one
    // of the stopping condition is met
    while (true)
    {
        // Sort the list in non-decreasing order
        Collections.sort(a, Collections.reverseOrder());
        // Check if all the elements are equal to 0
        if ((int)a.get(0) == 0)
            return true;
        // Store the first element in a variable
        // and delete it from the list
        int v = (int)a.get(0);
        a.remove(a.get(0));
        // Check if enough elements
        // are present in the list
        if (v > a.size())
            return false;
        // Subtract first element from
        // next v elements
        for(int i = 0; i         {
            a.set(i, (int)a.get(i) - 1);
            // Check if negative element is
            // encountered after subtraction
            if ((int)a.get(i) <0)
                return false;
        }
    }
}
// Driver Code
public static void main(String[] args)
{
    ArrayList a = new ArrayList();
    a.add(3);
    a.add(3);
    a.add(3);
    a.add(3);
    int n = a.size();
    if (graphExists(a, n))
    {
        System.out.print("Yes");
    }
    else
    {
        System.out.print("NO");
    }
}
}
// This code is contributed by pratham76

Python 3

# Python3 implementation of the approach
# Function that returns true if
# a simple graph exists
def graphExists(a):
    # Keep performing the operations until one
    # of the stopping condition is met
    while True:
        # Sort the list in non-decreasing order
        a = sorted(a, reverse = True)
        # Check if all the elements are equal to 0
        if a[0]== 0 and a[len(a)-1]== 0:
            return True
        # Store the first element in a variable
        # and delete it from the list
        v = a[0]
        a = a[1:]
        # Check if enough elements
        # are present in the list
        if v>len(a):
            return False
        # Subtract first element from next v elements
        for i in range(v):
            a[i]-= 1
            # Check if negative element is
            # encountered after subtraction
            if a[i]<0:
                return False
# Driver code
a = [3, 3, 3, 3]
if(graphExists(a)):
    print("Yes")
else:
    print("No")

C

// C# implementation of the approach
using System;
using System.Collections;
class GFG{
// Function that returns true if
// a simple graph exists
static bool graphExists(ArrayList a, int n)
{
    // Keep performing the operations until one
    // of the stopping condition is met
    while (true)
    {
        // Sort the list in non-decreasing order
        a.Sort();
        a.Reverse();
        // Check if all the elements are equal to 0
        if ((int)a[0] == 0)
            return true;
        // Store the first element in a variable
        // and delete it from the list
        int v = (int)a[0];
        a.Remove(a[0]);
        // Check if enough elements
        // are present in the list
        if (v > a.Count)
            return false;
        // Subtract first element from
        // next v elements
        for(int i = 0; i         {
            a[i] = (int)a[i] - 1;
            // Check if negative element is
            // encountered after subtraction
            if ((int)a[i] <0)
                return false;
        }
    }
}
// Driver Code
public static void Main(string[] args)
{
    ArrayList a = new ArrayList(){ 3, 3, 3, 3 };
    int n = a.Count;
    if (graphExists(a, n))
    {
        Console.Write("Yes");
    }
    else
    {
        Console.Write("NO");
    }
}
}
// This code is contributed by rutvik_56

java 描述语言


Output: 

Yes

时间复杂度: O( N^2*logN )
辅助空间: O(1)


推荐阅读
  • 本文介绍了一种简化版的在线购物车系统,重点探讨了用户登录和购物流程的设计与实现。该系统通过优化界面交互和后端逻辑,提升了用户体验和操作便捷性。具体实现了用户注册、登录验证、商品浏览、加入购物车以及订单提交等功能,旨在为用户提供高效、流畅的购物体验。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 使用 XlsxWriter 模块在 Python 中实现 Excel 单元格内多种格式文本的高效写入
    XlsxWriter 是一个强大的 Python 库,专门用于生成 `.xlsx` 格式的 Excel 文件。该模块不仅支持基本的数据写入,还提供了丰富的格式化选项,能够实现单元格内多种文本样式的高效处理。无论是字体、颜色、对齐方式还是边框,XlsxWriter 都能轻松应对,满足用户在 Excel 视图中的各种需求。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 如何在 Python 编程中实现各种数据类型的字符串转换? ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • 深入解析Java中HashCode的功能与应用
    本文深入探讨了Java中HashCode的功能与应用。在Java中,HashCode主要用于提高哈希表(如HashMap、HashSet)的性能,通过快速定位对象存储位置,减少碰撞概率。文章详细解析了HashCode的生成机制及其在集合框架中的作用,帮助开发者更好地理解和优化代码。此外,还介绍了如何自定义HashCode方法以满足特定需求,并讨论了常见的实现误区和最佳实践。 ... [详细]
  • Jedis接口分类详解与应用指南
    本文详细解析了Jedis接口的分类及其应用指南,重点介绍了字符串数据类型(String)的接口功能。作为Redis中最基本的数据存储形式,字符串类型支持多种操作,如设置、获取和更新键值对等,适用于广泛的应用场景。 ... [详细]
  • POJ 1696: 空间蚂蚁算法优化与分析
    针对 POJ 1696 的空间蚂蚁算法进行了深入的优化与分析。本研究通过改进算法的时间复杂度和空间复杂度,显著提升了算法的效率。实验结果表明,优化后的算法在处理大规模数据时表现优异,能够有效减少计算时间和内存消耗。此外,我们还对算法的收敛性和稳定性进行了详细探讨,为实际应用提供了可靠的理论支持。 ... [详细]
  • 在探讨 AS3 中的数据深度复制技术时,本文详细介绍了实现数据深度克隆的有效方法。通过对比多种方案,最终确定了一种高效且可靠的实现方式,所有代码均来源于公开资源,确保了方法的实用性和可操作性。 ... [详细]
  • 在幼儿园中,有 \( n \) 个小朋友需要通过投票来决定是否午睡。尽管这个问题对每个孩子来说并不是特别重要,但他们仍然希望通过谦让的方式达成一致。每个人都有自己的偏好,但为了集体和谐,他们决定采用一种最小割的方法来解决这一问题。这种方法不仅能够确保每个人的意愿得到尽可能多的尊重,还能找到一个最优的解决方案,使整体满意度最大化。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 本文将介绍一种扩展的ASP.NET MVC三层架构框架,并通过使用StructureMap实现依赖注入,以降低代码间的耦合度。该方法不仅能够提高代码的可维护性和可测试性,还能增强系统的灵活性和扩展性。通过具体实践案例,详细阐述了如何在实际开发中有效应用这一技术。 ... [详细]
author-avatar
烦了_12664
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有