📜  门| GATE-IT-2004 |问题12(1)

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

门(GATE-IT-2004)问题12

这是计算机科学门(GATE-IT-2004)考试中的一个问题,要求考生实现一个程序来查看一个指定节点在给定有向无环图中的入度和出度。

给定输入

输入数据格式如下:

一行,两个数字:$n$ 和 $m$。分别表示图中节点数和边数。

接下来 $m$ 行,每行给出两个数字 $x$ 和 $y$,表示有一条从 $x$ 到 $y$ 的边。

接下来一行,一个数字 $s$,表示要查询入度和出度的节点。

输出格式

输出数据格式如下:

一行,两个数字:$d_{in}(s)$ 和 $d_{out}(s)$。分别表示节点 $s$ 的入度和出度。

解决方案

此问题可以通过构建邻接表来解决。先构建一个 $n$ 个元素的数组,每个元素为一个链表,用来存储每个节点的出边列表。然后遍历边列表,把每条边的起点添加到对应的节点的链表里。

AdjacencyList: array of lists of integers
for each (x, y) in edges do 
    add y to AdjacencyList[x] // 把y添加到x的出边列表里

要查询一个节点的入度和出度,只需要分别遍历它在邻接表中的出边列表和入边列表,统计元素个数即可。

int in_degree = 0;
int out_degree = AdjacencyList[s].size(); // 计算出度
for each node in graph do
    for each neighbor in AdjacencyList[node] do
        if (neighbor == s) then
            in_degree = in_degree + 1 // 遍历入边列表,统计入度

最后将入度和出度输出即可。

时间复杂度

构建邻接表的时间复杂度为 $O(m)$。查询一个节点的入度和出度的时间复杂度为 $O(n)$。整个算法的时间复杂度为 $O(m+n)$。

代码实现

以下是一个 Python 代码实现的例子:

# 读入数据
n, m = map(int, input().split())
edges = []
for i in range(m):
    x, y = map(int, input().split())
    edges.append((x, y))
s = int(input())

# 构建邻接表
AdjacencyList = [[] for i in range(n+1)]
for x, y in edges:
    AdjacencyList[x].append(y)

# 计算入度和出度
in_degree = 0
out_degree = len(AdjacencyList[s])
for node in range(1, n+1):
    for neighbor in AdjacencyList[node]:
        if neighbor == s:
            in_degree += 1

# 输出结果
print(in_degree, out_degree)

完整代码片段已经按 markdown 标记返回。