Skip to content

19943: 图的拉普拉斯矩阵

matrices, http://cs101.openjudge.cn/practice/19943/

在图论中,度数矩阵是一个对角矩阵 ,其中包含的信息为的每一个顶点的度数,也就是说,每个顶点相邻的边数。邻接矩阵是图的一种常用存储方式。如果一个图一共有编号为0,1,2,…n-1的n个节点,那么邻接矩阵A的大小为n*n,对其中任一元素Aij,如果节点i,j直接有边,那么Aij=1;否则Aij=0。

将度数矩阵与邻接矩阵逐位相减,可以求得图的拉普拉斯矩阵。具体可见下图示意。

img

现给出一个图中的所有边的信息,需要你输出该图的拉普拉斯矩阵。

输入

第一行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)))