📜  门| GATE-CS-2005 |第 31 题(1)

📅  最后修改于: 2023-12-03 14:58:26.416000             🧑  作者: Mango

门(GATE-CS-2005) | 第 31 题

该题目是计算机科学的门(GATE)考试中的一道题目,年份为2005。它涉及算法和数据结构的内容。让我们一起来分析这道题目并展示如何解决。

答案将按照 Markdown 格式给出。

题目描述

考虑一个具有n个节点的有向图,节点从1到n编号。给定一个邻接矩阵adj表示图的边缘,其中adj[i][j]等于1表示从节点i到节点j有一条边缘,adj[i][j]等于0表示没有边缘。请实现一个函数in_degrees(adj: List[List[int]]) -> List[int],计算每个节点的入度(节点有多少条边缘指向它)。返回一个列表,其中第i个元素是节点i的入度。

示例

输入:

adj = [
  [0, 1, 1, 0],
  [0, 0, 0, 1],
  [0, 0, 0, 0],
  [0, 0, 1, 0]
]

输出:

[0, 1, 2, 1]

解题思路

首先,我们需要创建一个长度为n的空列表in_deg,用于存储每个节点的入度。然后,我们遍历邻接矩阵adj的每个元素adj[i][j],如果adj[i][j]为1,则说明节点j指向节点i,因此节点i的入度增加1。

下面是解决该问题的 Python 代码片段:

def in_degrees(adj):
    n = len(adj)
    in_deg = [0] * n  # 初始化每个节点的入度为0

    for i in range(n):
        for j in range(n):
            if adj[i][j] == 1:
                in_deg[i] += 1

    return in_deg

上述代码中,我们使用了两个嵌套的for循环遍历邻接矩阵adj的每个元素,如果adj[i][j]为1,就将节点i的入度加1。

复杂度分析

  • 时间复杂度:该算法使用了两个嵌套的循环,对于n个节点的图,时间复杂度为O(n^2)。
  • 空间复杂度:除了输入和输出之外,算法使用了一个额外的列表以存储节点入度,因此空间复杂度为O(n)。

这道题目要求我们计算有向图每个节点的入度。通过使用邻接矩阵来描述图,并根据图的性质,我们可以轻松地计算出每个节点的入度。