求有向图G中各顶点的入度与出度。建议分别采用邻接矩阵和邻接表这两种不同的存储结构完成。 输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试第一行输入2个整数n、m(2≤n≤26,1≤m≤n(n-1)/2),分别表示顶点数、边数;然后输入m行,每行包含两个顶点Ai、Bi(大写字母表示),表示Ai到Bi有一条有向边。 输出格式: 对于每组测试,输出n行,依顶点的字典序在每行上输出各顶点的入度和出度(数据之间留一个空格)。 输入样例: 1 5 4 A C A B B D E C 输出样例: 0 2 1 1 2 0 1 0 0 1
时间: 2024-03-13 17:42:42 浏览: 86
好的,我知道了。这是一道计算有向图各顶点入度和出度的问题。可以使用邻接矩阵或邻接表两种数据结构来实现。那我来给您讲一下各自的实现方法吧。
首先,邻接矩阵的实现方法是这样的:定义一个大小为 $N\times N$ 的二维数组 $mat$,其中 $N$ 表示图中顶点的数量。如果顶点 $i$ 到顶点 $j$ 有一条有向边,则 $mat_{i,j}$ 的值为 1,否则为 0。这样,顶点 $i$ 的出度就等于 $mat_{i,1}+mat_{i,2}+\cdots+mat_{i,N}$,入度就等于 $mat_{1,i}+mat_{2,i}+\cdots+mat_{N,i}$。具体实现过程可以参考下面的代码:
```python
n = 26 # 顶点数的上限
t = int(input()) # 测试数据组数
for _ in range(t):
# 读入图的顶点数和边数
n, m = map(int, input().split())
# 初始化邻接矩阵
mat = [[0]*n for _ in range(n)]
# 读入每条边,并将邻接矩阵中对应位置的值设为 1
for _ in range(m):
a, b = input().split()
i, j = ord(a)-ord('A'), ord(b)-ord('A')
mat[i][j] = 1
# 计算每个顶点的入度和出度
for i in range(n):
out_degree = sum(mat[i])
in_degree = sum(mat[j][i] for j in range(n))
print(f"{chr(i+ord('A'))} {in_degree} {out_degree}")
```
其次,邻接表的实现方法是这样的:定义一个大小为 $N$ 的列表 $adj$,其中 $adj_i$ 存储了从顶点 $i$ 出发的所有有向边的终点。例如,如果顶点 $i$ 到顶点 $j$ 有一条有向边,则 $adj_i$ 中就包含一个值为 $j$ 的元素。这样,顶点 $i$ 的出度就等于 $len(adj_i)$,入度就等于所有 $adj_j$ 中值为 $i$ 的元素的数量。具体实现过程可以参考下面的代码:
```python
n = 26 # 顶点数的上限
t = int(input()) # 测试数据组数
for _ in range(t):
# 读入图的顶点数和边数
n, m = map(int, input().split())
# 初始化邻接表
adj = [[] for _ in range(n)]
# 读入每条边,并将终点添加到起点的邻接表中
for _ in range(m):
a, b = input().split()
i, j = ord(a)-ord('A'), ord(b)-ord('A')
adj[i].append(j)
# 计算每个顶点的入度和出度
for i in range(n):
out_degree = len(adj[i])
in_degree = sum(1 for j in range(n) if i in adj[j])
print(f"{chr(i+ord('A'))} {in_degree} {out_degree}")
```
这样,我就把问题的解决方法告诉您了。如果您还有其他问题,可以继续问我哦~
阅读全文