19943: 图的拉普拉斯矩阵
matrices, http://cs101.openjudge.cn/practice/19943/
在图论中,度数矩阵是一个对角矩阵 ,其中包含的信息为的每一个顶点的度数,也就是说,每个顶点相邻的边数。邻接矩阵是图的一种常用存储方式。如果一个图一共有编号为0,1,2,…n-1的n个节点,那么邻接矩阵A的大小为n*n,对其中任一元素Aij,如果节点i,j直接有边,那么Aij=1;否则Aij=0。
将度数矩阵与邻接矩阵逐位相减,可以求得图的拉普拉斯矩阵。具体可见下图示意。

现给出一个图中的所有边的信息,需要你输出该图的拉普拉斯矩阵。
输入
第一行2个整数,代表该图的顶点数n和边数m。 接下m行,每行为空格分隔的2个整数a和b,代表顶点a和顶点b之间有一条无向边相连,a和b均为大小范围在0到n-1之间的整数。输入保证每条无向边仅出现一次(如1 2和2 1是同一条边,并不会在数据中同时出现)。
输出
共n行,每行为以空格分隔的n个整数,代表该图的拉普拉斯矩阵。
样例输入
4 5
2 1
1 3
2 3
0 1
0 2样例输出
2 -1 -1 0
-1 3 -1 -1
-1 -1 3 -1
0 -1 -1 2来源:cs101 2019 Final Exam
2022fall-cs101,陈睿婷,化学与分子工程学院。
观察发现本质上要输出的矩阵有以下特点:对角线为一行所包含的元素个数和,以从左上到右下的对角线为对称轴,输入数据为i, j 时矩阵的i, j 以及j, i 的位置均需要-1。
2020fall-cs101,蓝克轩。思路:因为公式是L=D-A,所以接受输入时,可以一次过在对角线加1(D),再在相应的元素减1(-A).
2020fall-cs101,郭冠廷。思路:拉普拉斯矩阵不用算两个相减,因为对角线和非对角线肯定不相关联,直接输入到同一个矩阵中即可。
python
n, m = map(int, input().split())
ans = [[0 for i in range(n)] for j in range(n)]
for i in range(m):
knot1, knot2 = map(int, input().split())
ans[knot1][knot1] += 1
ans[knot2][knot2] += 1
ans[knot1][knot2] -= 1
ans[knot2][knot1] -= 1
for j in range(n):
print(' '.join(map(str, ans[j])))python
n,m = map(int, input().split())
D = [[0]*n for _ in range(n)]
A = [[0]*n for _ in range(n)]
for _ in range(m):
n1,n2 = map(int, input().split())
D[n1][n1] += 1
D[n2][n2] += 1
A[n1][n2] = 1
A[n2][n1] = 1
#print(D)
#print(A)
for r in range(n):
for c in range(n):
D[r][c] -= A[r][c]
#print(D)
# print
for row in D:
print(' '.join(map(str,row)))