📌  相关文章
📜  国际空间研究组织 | ISRO CS 2009 |问题 1(1)

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

国际空间研究组织 | ISRO CS 2009 | 问题 1

问题描述

在一个无向图中,给定节点总数和每个节点的度数,判断图是否连通。

输入格式

第一行包含一个整数 $N$,表示节点的总数。

第二行包含 $N$ 个整数,表示每一个节点的度数。

输出格式

如果给定的图是连通的,输出字符串 Yes,否则输出字符串 No

示例
输入样例:
4
1 2 2 3
输出样例:
Yes
解题思路

对于一个连通的无向图,节点数 $N$ 和边数 $E$ 之间有一个关系:$E \ge \frac{(N-1) \times N}{2}$。如果给定的图的边数小于这个数,那么它一定不连通。

由于每个节点的度数已知,所以对于每一个节点 $i$,它与其他节点之间相连的边数不能多于它的度数。因此,我们可以遍历每一个节点,计算出它与其他节点之间的边数之和 $edge$,并与它的度数 $deg_i$ 进行比较,如果 $edge$ 小于 $deg_i$,则说明该节点未能与所有节点相连,因此,退出循环,输出 No

如果遍历完节点之后,没有退出循环,那么说明这个图是连通的,输出 Yes

参考代码
n = int(input())  # 获取节点总数
degrees = list(map(int, input().split()))  # 获取每个节点的度数

edge_count = sum(degrees) // 2  # 计算边数
if edge_count < (n - 1) * n // 2:
    print("No")  # 边数太少,不是连通图
else:
    for i in range(n):
        edges = sum(degrees) - degrees[i]
        if edges < (n - 1):  # 该节点的边数不足,不是连通图
            print("No")
            break
    else:
        print("Yes")

简要说明:

  1. 输入节点总数和每个节点的度数。
  2. 根据每个节点的度数和图中节点数计算总边数,判断是否满足 $E \ge \frac{(N-1) \times N}{2}$,不满足则输出 No
  3. 遍历每一个节点,计算该节点与其他节点之间的边数之和,比较与该节点的度数的大小,如果小于该节点的度数,则输出 No,退出循环。如果全部节点都满足条件,则输出 Yes