热门标签 | 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)


推荐阅读
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • Markdown 编辑技巧详解
    本文介绍如何使用 Typora 编辑器高效编写 Markdown 文档,包括代码块的插入方法等实用技巧。Typora 官方网站:https://www.typora.io/ 学习资源:https://www.markdown.xyz/ ... [详细]
  • 本文探讨了在SQL Server中处理几何类型列时遇到的INTERSECT操作限制,并提供了解决方案,包括通过转换数据类型和使用额外表结构的方法。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • CRZ.im:一款极简的网址缩短服务及其安装指南
    本文介绍了一款名为CRZ.im的极简网址缩短服务,该服务采用PHP和SQLite开发,体积小巧,约10KB。本文还提供了详细的安装步骤,包括环境配置、域名解析及Nginx伪静态设置。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
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社区 版权所有