原创 我是8位的 我是8位的
图(Graph)是离散数学中的一种常见数据结构,由节点和边组成,如果边有方向,就是有向图。下图是一个有4个节点5条边的有向图:
![0462a7aba21208e308af4224df51719f.png](https://i-blog.csdnimg.cn/blog_migrate/0b89c79b024e445a45403159c875bb1e.png)
这个图(Graph)可以表示电网、网络或建筑物通道的数学模型。
关联矩阵
可以通过一个矩阵来解析有向图,这个矩阵称为关联矩阵(Incidence Matrix)。4个节点5条边的图用一个5×4的矩阵表示,用正负表示边的方向,矩阵的一行相当于图的一条边,矩阵的一列对应图的一个节点:
![20642a46fd704ee6bd40f0846c5447fa.png](https://i-blog.csdnimg.cn/blog_migrate/93d2ef26d6983b412fe86b65c8e87717.png)
以A的第一行为例,它对应图的第一条边e1,e1的方向是从
A的前三行对应了三边e1,e2,e3,它们构成了图中的一个回路。对于一个图来说,回路的数量和位置至关重要。把回路单独拿出来看:
![1c5746b3e7edb3376d3d00611582a8c5.png](https://i-blog.csdnimg.cn/blog_migrate/be477323c1ba9159e65dde2ba83a3fb2.jpeg)
问题之一是:这三行相互独立吗?或者说它们是否是线性无关的?
似乎很容易看出,第3行可以由第1行和第2行相加得到,这说明回路对应的行是线性相关的。从图上看,从
存储大型关联矩阵
如果用关联矩阵描述一个大型图,你会发现矩阵中的0非常多,这个矩阵是一个稀疏矩阵。用计算机存储这个矩阵时,应当考虑是否应该用邻接表代替二维数组,同时也可以使用一维数组代替二维数组。
邻接表是一种常用的数据结构,它是一个存储了链表的一维数组。
还是这个图,现在不考虑方向,用一维数组描述:
![d9f47a9c9616a600ef52489df1e4e26c.png](https://i-blog.csdnimg.cn/blog_migrate/9b6056695ef2db8bbc44156a5c40cf2b.png)
n1与n2联通,将L[1]与L[2]赋予n2的序号,L = [2,2,0,0];
n2与n3联通,将L[2]和与L[2]相连的所有节点都赋予n3的序号,L = [3,3,3,0];
n3与n4联通,将L[3]和与L[4]相连的所有节点都赋予n4的序号,L = [4,4,4,4]。
对于回路不必重新负值:
n1与n4联通,但是它们之间已经有回路了,L[1] == L[4];
n1与n3联通,它们之间同样有回路,L[1] == L[3]。
最终,L = [4,4,4,4],判断两点np与nq是否联通,只需要判断if L[p] == L[q]即可。
关联矩阵的零空间
![842397b95e65928db289a86c6b178ad6.png](https://i-blog.csdnimg.cn/blog_migrate/1136b77230b90cbb415528550c449462.jpeg)
如果A的零空间是零向量,则意味着Ax = 0有唯一解,此时A应当是方阵,A的行最简阶梯矩阵是单位矩阵,A的各列线性无关。
A不是方阵,所以x没有唯一解。这很容易验证,Ax = 0中,x有4个分量,方程组中有5个方程,但只有4个未知数,所以方程有无数解。
![919f5d67e3944a625a29ed2e4186a005.png](https://i-blog.csdnimg.cn/blog_migrate/8666f0131b659bf6b7ac323957a585f7.png)
只要x1 = x2 = x3 = x4,就满足Ax = 0。A的零空间是位于
![9066889d88ba784e647b7784fcb8a190.png](https://i-blog.csdnimg.cn/blog_migrate/b1c53cacd75cfe5d7bfd84283599a554.png)
如果A是电网,xn表示每个节点的电势,则上面的
![9bca8c8ad43f9ce67b08cf842b8f6986.png](https://i-blog.csdnimg.cn/blog_migrate/318d5ed8148d7f55d9204a0eabb21fc5.png)
对于Ax来说,x4 = 0意味着A的最后一列不起作用(最后一列的各个分量与0的相乘总是0)。这样,A前三列就变成线性无关,实际上A的任意三列都是线性无关,A的秩是3。