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


推荐阅读
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • Python实现斐波那契数列的方法与优化
    本文详细介绍了如何在Python中编写斐波那契数列,并探讨了不同的实现方法及其性能优化。通过递归、迭代和公式法,读者可以了解每种方法的优缺点,并选择最适合自己的实现方式。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 本文介绍了SVD(奇异值分解)和QR分解的基本原理及其在Python中的实现方法。通过具体代码示例,展示了如何使用这两种矩阵分解技术处理图像数据和计算特征值。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
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社区 版权所有