📌  相关文章
📜  具有N个顶点和M个边的简单图的数量(1)

📅  最后修改于: 2023-12-03 15:36:47.392000             🧑  作者: Mango

计算具有N个顶点和M个边的简单图的数量

无向图是由一组节点和连接这些节点的边组成的。而简单无向图是不包含重复的边和自环的无向图。在这里,我们将介绍如何计算具有N个顶点和M个边的简单图的数量。

首先,我们可以确定最少的边数和最多的边数。对于N个顶点的完全图,其边数为N*(N-1)/2,而对于只有一个顶点的图,边数为0。因此,我们可以确定最少的边数为0,最多的边数为N*(N-1)/2。如果M小于0或大于最多的边数,则图的数量为0。

接下来,我们可以使用组合数公式计算不同边数下的图的数量。组合数是从N个元素中选择k个元素的组合数量。我们的目标是选择M个边,从N*(N-1)/2个可能的边中选择。因此,具有N个顶点和M个边的简单图的数量为:

$${{N*(N-1)/2}\choose{M}}$$

该公式的实现可以使用递归计算阶乘和组合数,但是由于可能出现溢出的情况,因此更好的方法是使用动态规划来计算组合数。

下面是一个Python函数实现,输入参数为N和M,输出结果为计算出的图的数量(Markdown格式):

import math

def count_simple_graphs(N, M):
    """
    计算具有N个顶点和M个边的简单图的数量
    :param N: 顶点数
    :param M: 边数
    :return: 图的数量
    """
    if M < 0 or M > N*(N-1)//2:
        return 0

    # 计算组合数
    c = [[0 for _ in range(M+1)] for _ in range(N*(N-1)//2 + 1)]
    for i in range(N*(N-1)//2 + 1):
        c[i][0] = 1
    for i in range(1, N*(N-1)//2 + 1):
        for j in range(1, M+1):
            c[i][j] = c[i-1][j] + c[i-1][j-1]

    return c[N*(N-1)//2][M]

# 测试
print(count_simple_graphs(3, 2)) # 1
print(count_simple_graphs(4, 3)) # 9

参考文献:

  1. 计算组合数的动态规划方法:https://en.wikipedia.org/wiki/Dynamic_programming
  2. 图的组合数计算:https://math.stackexchange.com/questions/1033563/how-to-calculate-the-number-of-graphs-with-n-vertices-and-exactly-m-edges