离散数学之图的矩阵表示及基本运算
离散数学-图的矩阵表示
分析:从 到 长度为2的路,中间必须经过 如果图G 中有路 存在,则肯定有 ,反之如果 图G中不存在路 ,那么 或者 ,即 于是从结点 到 的长度为2的路的数目就 等于:
按照矩阵的乘法规则,上式恰好等于矩阵 的元素,即 表示从 到 ; 的长度为2的路的数目
中第i行,第j列
考虑从vi到v j的长度为3的路的数目,可以看作是由vi到vk的长度为1的路,再 联结vk 到v j的长度为2的路,则类似可知从vi到v j的长度为3的路的数目为: a
( 3) ij ( 2) aik akj ,即为( A(G )) 3的第i行,第j列元素。 k 1 n
行相加运算: 有向图:对应分量普通加法运算; 无向图:对应分量模2加法运算。 行相加相当于G中对应结点的合并。 air a jr 1 ,说明v 和v 中只有一个结点是边e 的端点,合并 i j r 后仍是er的端点。
air a jr 0 ,有两种情况:
a、vi,vj都不是er的端点; b、vi,vj都是er的端点,合并后删去自回路。 若合并后完全关联矩阵中出现元素全为0的列,表明对应的 边消失。 有了这种运算,就可以运用这种运算求关联矩阵的秩
1 0 1 0
0 1 0 0
0 1 ,求G的可达性矩阵。 1 0
Байду номын сангаас
0 2 A2 1 0
0 1 1 1
1 0 1 0
1 1 1 0
2 1 A3 2 0
4 5 7 2 2 4 4 1
1 2 2 0
3 6 7 2
0 1 1 1
由前面的定理7-2.1的推论可知,如果在vi到vj之间存在路,必定存在 一条长度不超过n的通路,所以l只需计算到n就可以了。
离散数学图的基本概论
简单通路: = v0 e1 v1 e2… ek vk为通路且边e1 e2… ek 互不相同,又称之为迹,可简用v0 v1 … vk 来表示。 简单回路 (v0 = vk)又称为闭迹。
初级通路或基本通路: = v0 e1 v1 e2… ek vk为通路 且顶点v0 v1… vk 互不相同。 基本回路: v0 = vk。 初级通路一定是简单通路,但简单通路
不一定是一条初级通路。
例8.6 就下面两图列举长度为5的通路,简 单通路,回路,简单回路,再列举长 度为3的基本通路和回路。
e3 v5
e7 v4
v1
e2
e1 v2
e6 e4
e5 v3
e1 v5 e8 e4
v4
v1
e3
e2 v2
e6 e5
e7 v3
(1)
(2)
解:试对照定义,自己做一做!如:
(1)中 v1e1v2e2v5e3v1e1v2e4v3 为v1到v3的通路;
021?01ijn11iiij??????mmjm从而?12im1jijvdm?????mmvvddmm??????i?????1i?niinmijij11从而有从而有1?im1jijvdm??????由mij的定义知?11jmvdm????????i???1i??n1inm1jij1通路数与回路数的矩阵算法
平行边:无向图中,关联一对结点的无向边 多于一条,平行边的条数为重数; 有向图中,关联一对顶点的无向边 多于一条,且始、终点相同。
多重图:包含平行边的图。
简单图:既不包含平行边又不包含环的图。
二、度
度:(1) 在无向图G = < V, E >中,与顶点v(vV) 关联的边的数目(每个环计算两次),记 作:d(v)。
离散数学图的矩阵表示
A4=
23321
01011
11010
22221
V4
v3
问每条:从vv33到到0 v0v1由1长1长0度上度0为可为22看的的路出路有A,n几中中条间元?02肯素11定a01经ij的11过10意1个义中:间结点vk,
A该 即 逐(G路个v)23=,k表遍v示历k,1为0201每=11111:个。a0101iv结每j=31100点k有1000表,v一k 示并个进v从vA1k,(,行Gv)在i3就乘到= 邻对法v接j应运长100矩一算302度阵个,111为中110v获3n110,,k取的v就从k路,1是=v3有1:到;kvv31条,k全=。1部,长vk度,1=为1,2 的路的数目:v3,1v1,1+v3,2其v中21+a3v2=3,33表v示3,1v+3到v3,v42长v4度,1+为v33,的5路v5,有1=3条v。3,ivi,1
由于,邻接矩阵的定义与关系矩阵表示定义相同,所以,可达性
矩阵P即为关系矩阵的MR+,因此P矩阵可用Warshall算法计算。
13
❖可达性矩阵的求解方法
23221 35332 58553 12111 46442
Br的任一元素bij表示的是从vi到vj长度不超过r的路的数目;
若bij 0,
若bij=0,
ij时,表示vi到vj可达, i=j时,表示vi到vi有回路;
ij时,表示vi到vj不可达, i=j时,表示vi到vi无回路;
在许多实际问题中,我们关心的往往是vi和vj之间是否存在路的 问题,而对路的数目不感兴趣,为此,引出可达矩阵。
由7.2.1推论,若从vi到vj存在一条路,则必存在一条边数小于n 的通路,(或边数小于等于n的回路)。即:如果不存在一条小
《离散数学》图论 (上)
无向图与有向图
v2
e1
e2
e3
v3
e4
v1
e5 (e1)={( v42, v24 )}
v4
(e2)={( v32, v23 )} (e3)={( v3, v4 )}
(e4)=({ v43, v34 )}
(e5)=({ v4,}v4 )
13
无向图与有向图
A B C
D E F
14
无向图与有向图
第八章 图论
第八章 图论
§8.1 基本概念
§8.1.1 无向图、有向图和握手定理 §8.1.2 图的同构与子图 §8.1.3 道路、回路与连通性 §8.1.4 图的矩阵表示
§8.2 欧拉图 §8.3 哈密尔顿图 §8.4 平面图 §8.5 顶点支配、独立与覆盖
2
无向图与有向图
3
无向图与有向图
一个无向图(undirected graph, 或graph) G 指一个三元组 (V, E, ),其中
vV
vV
24
特殊的图
假设 G=(V, E, ) 为无向图,若 G 中所有 顶点都是孤立顶点,则称 G 为零图(null graph)或离散图(discrete graph);若 |V|=n,|E|=0,则称 G 为 n 阶零图 所有顶点的度数均相等的无向图称为正 则图(regular graph),所有顶点的度数 均为 k 的正则图称为k度正则图,也记作 k-正则图 注:零图是零度正则图
19
握手定理
定理(图论基本定理/握手定理)
假设 G=(V, E, ) 为无向图,则deg(v) 2 E , vV
即所有顶点度数之和等于边数的两倍。
推论
在任何无向图中,奇数度的顶点数必是偶 数。
离散数学第8章 图论
为d(vi,vj)。
8.2
图的矩阵表示
一、图的邻接矩阵 二、图的连接矩阵
三、图的关联矩阵
二、图的连接矩阵 定义 8-9 设图 G= ( V , E ),其中 V={v1 ,
v2 , … , vn } , n 阶方阵 C= ( cij ),称为图 G 的连接 矩阵,其中第i行j列的元素
1 c ij 0
利用邻接矩阵,我们可以 (1)判断G中任意两个结点是否相连接;
方法是:对 l=1,2,…,n–1,依次检查Al的(i,j)
项元素
(l ( ) ij)是否为0,若都为0,那么结点v 与v 不 a ij i j
相连接,否则vi与vj有路相连接。 (2)计算结点vi与vj之间的距离。
(1) ( 2) ( n 1) 中至少有一个不为0, 若 aij , aij , , aij 则可断定vi与vj相连接,使 a (l ) 0 的最小的 l 即
若中有相同的结点,设为ur= uk(r<k),则子路ur+1…uk可以从 中删去而形成一条较短的路= viu1…ur uk+1…uh–1 vj,仍连接vi到 vj 。 若中还有相同的结点,那么重复上述过程又可形成一条 更短的路,…。这样,最后必得到一条真路,它连接vi到vj, 并短于前述任一非真路。因此,只有真路才能是短程。
非真 生成
真 生成
真 非生成
非真 非生成
真 非生成
七、路与回路 定义:图G中l条边的序列{v0,v1}{v1,v2}…{vl–1,vl}称为连
接v0到vl的一条长为 l 的路。它常简单地用结点的序列 v0v1v2…vl–1vl来表示。其中v0和vl分别称为这条路的起点和终点。 开路:若v0vl,则称路v0v1v2…vl–1vl为开路; 回路:若v0=vl,则称路v0v1v2…vl–1vl为回路; 真路:若开路v0v1v2…vl–1vl中,所有结点互不相同(此时所有 边也互不相同),则称该路为真路; 环:在回路v0v1v2…vl–1v0中,若v0,v1,v2,…,vl–1 各不相同 (此时所有边也互不相同),则称该回路为环。
离散数学第九章 图的基本概念及其矩阵表示
奇数,因此
vV1
d (v) 是偶数,所以 d (v) 也是偶数,
V1 为偶数。
vV2
而 V1 中每个点 v 的度 d (v) 均为
vV1
vV2
图9.11 1至3阶完全有向图
显然,完全无向图的任意两个不同结点都邻接,完全有向图的任意两个不同结点之间都有 一对方向相反的有向边相连接。
9.1 图的基本概念
定理9.3 n个节点的无向完全图 证明:因为在无向完全图
k n 的边数为 Cn2 。
k n 中,任意两个节点之间都有边相连,所以 n
2 2 个节点中任取两个点的组合数为 Cn ,故无向完全图 的边数为 Cn 。
如果在
k n 中,对每条边任意确定一个方向,就称该图为 n 个节点的
2 有向完全图。显然,有向完全图的边数也是 Cn 。
主要内容
PART 01
PART 02
图的基本概念 子图和图的运算 路径、回路和连通性
图的矩阵表示
PART 03
PART 04
9.2 子图和图的运算
子图和补图
定义9.10 设 G V , E , 和 G ' V '(1)如果 V ' V , E ' E , ' ,则称 G ' 是 G 的子图,记作 G ' G, 并称 G 是 G ' 的母图。 (2)如果 V ' V , E ' E , ' ,则称 G ' 是 G 的真子图,记作
9.1 图的基本概念
矩阵的基本概念与运算
矩阵的基本概念与运算矩阵是线性代数学科中的基础工具,这是因为矩阵可以用来表示线性变换和线性方程组。
对于矩阵的基本概念与运算,我们需要从以下几个方面来分析。
一、矩阵的基本概念1、定义与记法矩阵是一个由m行n列元素排成的矩形阵列,常用大写字母表示,如A、B、C等。
其中,阵列中的m表示矩阵的行数,n则表示矩阵的列数。
因此,一个m行n列的矩阵可以写成:$A_{m×n}=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{m1}&a_{m2}& \cdots&a_{mn}\\\end{bmatrix}$其中,$a_{ij}$ 表示矩阵 A 中第 i 行第 j 列的元素。
2、矩阵的类型按照元素类型可以将矩阵分为实矩阵、复矩阵和布尔矩阵等。
按照矩阵的形状,矩阵可以分为方矩阵、长方矩阵和列矩阵等。
二、矩阵的基本运算1、矩阵的加法假设有两个矩阵 $A_{m×n}$ 和 $B_{m×n}$,它们对应位置相加的结果记作 $C=A+B$,则:$C_{ij}=A_{ij}+B_{ij}$2、矩阵的数乘假设有一个矩阵 $A_{m×n}$ 和一个数 $\lambda$,则它们的乘积记作 $B=\lambda A$,则:$B_{ij}=\lambda A_{ij}$3、矩阵的乘法假设有两个矩阵 $A_{m×n}$ 和 $B_{n×p}$,它们的乘积记作$C=AB$,则:$C_{ij}=\sum_{k=1}^n A_{ik}B_{kj}$矩阵乘法需要满足结合律,但不满足交换律,也就是说,$AB$ 与 $BA$ 不一定相等。
离散数学 7-3 图的矩阵表示
所以用此定理来证明某一特定图不是汉密尔顿图并不是
总是有效的。例如,著名的彼得森(Petersen)图,在图中删 去任一个结点或任意两个结点,不能使它不连通;删去3个结 点,最多只能得到有两个连通分支的子图;删去4个结点,只 能得到最多三个连通分支的子图;删去5个或5个以上的结点,
e3
v3
1 1 0 0 0
0 1 1 0 0
0 0 1 1 0
1 0 0 1 0
1 0 1 0 0
v3 0 v4 0 v5 0
无向图的关联矩阵反映出来图的性质:
每一条边关联两个结点,故每一列中只有两个1。
每一行中元素之和等于该行对应的结点的度数。
一行中元素全为0,其对应结点为孤立点。
两个平行边其对应的两列相同。 同一个图当结点或边的编号不同时,其对应的矩 阵只有行序列序的差别。
证明思路:1) 先证必要性: G有欧拉路 G连通 且(有0个 或 2个奇数度结点) 设G的欧拉路是点边序列v0e1v1e2… ekvk,其中结点可能重复, 但边不重复。因欧拉路经过(所有边)所有结点,所以图G 是连通的。 对于任一非端点结点vi,在欧拉路中每当vi出现一次,必关 联两条边,故vi虽可重复出现,但是deg(vi)必是偶数。对于端 点,若v0=vk ,则deg(v0)必是偶数,即G中无奇数度结点 。若 v0≠vk ,则deg(v0)必是奇数, deg(vk)必是奇数,即G中有两个奇 数度结点 。必要性证完。
e3
v3
0 0 0
-1 1 0 0
-1 1 0 0
有向图的关联矩阵的特点:
(1)每一列中有一个1和一个-1,对应一边一个始 点、一个终点,元素和为零。 (2)每一行元素的绝对值之和为对应点的度数。-1 的个数等于入度,1的个数等于出度。
离散数学课件14.4-5图的矩阵表示和运算
j)
或回路数 (i j) 。
求 D 中长度为l 的通路数和回路数。
考虑 Al (D) ,简记为 Al 。
(ai(jl) )nn
其中
a(l ij
)
n
a a (l1) (1) ik kj
k 1
a(l ij
)表示从
vi
到
v j 长度为 l
的通路数(i
j)
或回路数(i j)。
a(l ij
)为D
设D=<V,E>为一有向图,V={v1,v2,…,vn},令
pij
1 0
b ( n 1) ij
0
否则
Pii =1,i=1,2,…,n. 称(Pij)n×n为D的可达矩阵,记作P(D),简记P.
图的运算
1. 图的并运算 2. 图的交运算 3. 图的差运算 4. 图的环和运算
图的并运算
设图G1=〈V1,E1〉和图 G2=〈V2,E2〉 (同为有向图或无向图,并且不含孤立点)。
i 1
n
(4)
a (1) ii
为D
中环的个数。
i 1
在前例的有向图 D 中求 A2,A3,A4
1 2 1 0
A(D) 0 0 1 0 0 0 0 1 0 0 1 0
1 2 3 1
解:A2 0 0 0 1 , 0 0 1 0 0 0 0 1
1 2 4 3
A3 0 0 1 0 , 0 0 0 1 0 0 1 0
G1与G2的环和: 定义为图G3=〈V3,E3〉, 其中E3=E1⊕E2,V3 为与E3中边所关联的顶点,
记为G3=G1⊕G2。
运算举例
运算举例
课堂练习
P294 : 44(1)(2)(3), 45(1)(2).
《离散数学》第七章_图论-第3-4节
图的可达性矩阵计算方法 (3) 无向图的可达性矩阵称为连通矩阵,也是对称的。 Warshall算法
例7-3.3 求右图中图G中的可达性矩 阵。 分析:先计算图的邻接矩阵A布尔乘法的的2、 v1
3、4、5次幂,然后做布尔加即可。
解:
v4
v2
v3 v5
P=A∨ A(2) ∨ A(3) ∨A(4)∨A(5)
图的可达性矩阵计算方法(2)
由邻接矩阵A求可达性矩阵P的另一方法: 将邻接矩阵A看作是布尔矩阵,矩阵的乘法运算和加 法运算中,元素之间的加法与乘法采用布尔运算 布尔乘:只有1∧1=1 布尔加:只有0∨0=0 计算过程: 1.由A,计算A2,A3,…,An。 2.计算P=A ∨ A2 ∨ … ∨ An P便是所要求的可达性矩阵。
v4
v3
v2
G中从结点v2到结点v3长度 为2通路数目为0,G中长 度为2的路(含回路)总数 为8,其中6条为回路。 G中从结点v2到结点v3长度 为3的通路数目为2, G中 长度为3的路(含回路)总
图的邻接矩阵的 应用 (2)计算结点vi与vj之间的距离。
中不为0的最小的L即为d<vi,vj>。
(一)有向图的可达性矩阵
可达性矩阵表明了图中任意两个结点间是否至少存在一条 路以及在任何结点上是否存在回路。
定义7-3.2 设简单有向图G=(V,E),其中V={v1, v2,…,vn },n阶方阵P=(pij)nn ,称为图G的可达 性矩阵,其中第i行j列的元素
p ij =
1 1 1 1 P v3 1 1 v4 0 0 v5 0 0 v1 v2 1 1 1 1 1 1
0 1 A(G)= 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0
离散数学-图的矩阵表示
使用压缩矩阵
对于稠密图(边数较多的 图),可以使用压缩矩阵 来减少存储空间和计算时 间。
使用动态规划
对于某些特定的问题,可 以使用动态规划来优化算 法,提高计算效率。
05
离散数学-图的矩阵表示的挑战和未
来发展方向
离散数学-图的矩阵表示的挑战
计算复杂性
图的矩阵表示的计算复杂性较高, 特别是对于大规模图,需要消耗 大量的计算资源和时间。
表示图中任意两个顶点之间距离的矩阵, 距离矩阵中的元素d[i][ j]表示顶点i和顶点j 之间的最短路径长度。
图的邻接矩阵
1
邻接矩阵是表示图中顶点之间连接关系的常用方 法,其优点是简单直观,容易理解和计算。
2
邻接矩阵的行和列都对应图中的顶点,如果顶点i 和顶点j之间存在一条边,则矩阵中第i行第j列的 元素为1,否则为0。
THANKS
感谢观看
3
通过邻接矩阵可以快速判断任意两个顶点之间是 否存在边以及边的数量。
图的关联矩阵
01
关联矩阵是表示图中边和顶点之间关系的常用方法,
其优点是能够清晰地展示图中边的连接关系。
02
关联矩阵的行和列都对应图中的边,如果边e与顶点i相
关联,则矩阵中第i行第e列的元素为1,否则为0。
03
通过关联矩阵可以快速判断任意一条边与哪些顶点相
图的矩阵表示的算法复杂度分析
创建邻接矩阵的时间复杂 度:O(n^2),其中n是顶 点的数量。
查找顶点之间是否存在边 的复杂度:O(1)。
创建关联矩阵的时间复杂 度:O(m),其中m是边的 数量。
查找边的权重复杂度: O(1)。
图的矩阵表示的算法优化策略
01
02
03
离散数学课程设计.图的矩阵表示及基本运算
中国矿业大学软件开发基础实践报告姓名: xxs 学号: bbaa0edf 专业:计算机科学与技术指导教师: sjc 职称: js(仅供徐海计算机参考哈哈哈哈)2012 年 6 月 20 徐州目录第一章实验概述 (3)1.1实验目的 (3)1.2实验内容 (3)1.3实验环境 (3)第二章实验原理和实现过程 (4)2.1实验原理 (4)2.1.1建立图的邻接矩阵,判断图是否连通 (4)2.1.2 计算任意两个结点间的距离 (4)2.1.3对不连通的图输出其各个连通支 (5)2.2实验过程(算法描述) (5)2.2.1 程序整体思路 (5)2.2.2具体算法流程 (5)第三章实验数据及结果分析 (7)3.1建立图的邻接矩阵并判断图是否连通的功能测试及结果分析 (7)3.1.1输入无向图的边 (7)3.1.2建立图的连接矩阵 (8)3.2其他功能的功能测试和结果分析 (9)3.2.1计算节点间的距离 (9)3.2.2判断图的连通性 (9)3.2.3输出图的连通支 (10)3.2.4退出系统 (10)第四章实验收获和心得体会 (11)4.1实验收获 (11)4.2心得体会 (12)第五章实验源程序清单 (13)5.1程序代码 (13)第一章实验概述1.1 实验目的理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通支方法。
通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算,培养逻辑思维;通过实验提高学生编写实验报告、总结实验结果的能力,提高理论联系实际的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。
1.2 实验内容以偶对的形式输入一个无向简单图的边,建立该图的邻接矩阵,判断图是否连通(A),并计算任意两个结点间的距离(B),对不连通的图输出其各个连通支(C)。
注意:题目类型分为A,B,C三类,其中A为基本题,完成A类题目可达到设计的基本要求,其他均为加分题,并按字母顺序分数增加越高。
第六章 图的矩阵表示
•一个图的完全关联矩阵是不是唯一的?
•完全关联矩阵是不是唯一的确定一个图?
•用完全关联矩阵来表示图有什么好处?
•图的哪些性质可以从完全关联矩阵上一目了然?
•矩阵的运算是否会有相应的图的变化?
•反过来,图的哪些变化对应着完全关联矩阵的哪些变 化?
一般地说,我们把一个 n 阶方阵 A 的某些
列作一置换,再把相应的行作同样的置换,得
(1)
n i 1 m ij j 1 ij i m j 1 ij i ij i, j
(4) 平行边对应的列相同。 (5) 不能表示自环。
v2
e2
v3
e1
v1
e5
e4
e3
v1 M (G ) v2 v3 v 4
v4
e1 e2 1 1 1 1
e3
e4 1
1 1
0 0 1 1 1 1 0 0 0 0 → 1 1 0 1 0 0 0 0 0 0
1 0 M ' (G ) M ' (G1 ) 0
1 1 0 0
0 0 1 1 1 1 0 0 0 0 → 1 1 0 1 0 0 1 1 0 0
( )
( )
(3) (5)
1 0 0 0 0
1 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 1 0 4 0 0 0 0 1 1 0 0 0 0 1 1
6
1 0 0 0 0
1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1
0 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0
离散数学5-图的基本概念和矩阵表示
图的情况存在,例如下图:
21
§3 图的同构和子图
例:证明下图中的两个有向图是同构的。
证明:作映射 g(a)=4, g(b)=1, g(c)=2, g(d)=3, g(e)=5。
在该映射下,边<a,e>, <b,a>, <d,a>, <b,c>, <e,b>, <d,c>, <c,e>,
§1 基本概念
例:画出下列多重图G(V,E)的图形,其中V = {P1, P2, P3, P4, P5},且
(a)E = [{P2, P4 }, {P2, P3},{P3, P5 },{P5, P4 }];
(b)E = [{P1, P1 }, {P2, P3},{P2, P4 },{P3, P2 },{P4, P1 },{P5, P4 }];
为由边集E'导出的子图。
24
§3 图的同构和子图
➢ 下图展示了图G及其子图:
25
第五章 图的基本概念和矩阵表示
1.1 基本概念
1.6 矩阵表示
1.2 握手定理
1.7 路径
1.3 图的同构和子图 1.8 图的着色
1.4 图的操作
1.9 匹配
1.5 连通性
26
§4 图的操作
设图G1=<V1,E1>和图G2=<V2,E2>
+ ( ) = − ( ) =
∈
∈
( ) = +( ) + − ( ) =
∈
∈
Hale Waihona Puke 握手定理及其推论解释了结点数和边数的关系,我们可
离散数学之图的矩阵表示及基本运算
实验四图的矩阵表示及基本运算实验目的学习图在计算机中的矩阵表示,并能利用课堂所学知识进行出度和入度的计算。
实验内容与要求根据输入的整数对,输出一个图形的邻接矩阵。
并求出各结点的出度和入度。
实验准备图可以用多种方式来表示,其中邻接矩阵是一种较简单的方式。
复习关于邻接矩阵的描述。
明确一下内容:1.如何使用邻接矩阵表示图。
2.利用图的邻接矩阵求结点的出度和入度的方法。
#include <iostream.h>int** g(int n){int** a, i, j;a = new int* [n];//分配指针数组for(i=0; i<n; i++)a[i] = new int[n];//分配每个指针所指向的数组for(i=0; i<n; i++)for(j=0; j<n; j++) a[i][j]=0;return a;}struct M{int n;int isOrient;int **ele;};class Operators{public:void CreateMatrix2(M *x, int n, int isOrient);void Input(M *x);void Show(M *x);int deg_out(M *a, int i);int deg_in(M *a, int i);void Maccessibility(M *a, M *Ma);void MatrixMultiple(M *a, M *b, M *m);void MatrixAdd(M *a, M *b);};void Operators::CreateMatrix2(M *x, int n, int isOrient){x->n=n;x->isOrient=isOrient;x->ele=g(x->n);}void Operators::CreateMatrix(M *x){int n, isOrient;cout<<"Matrix's n=";cin>>n;cout<<"Is the graph oriented? 1=yes, 0=no :";cin>>isOrient;CreateMatrix2(x, n, isOrient);}void Operators::Input(M *x){int i, j;while(1){cout<<"Input the edge's start-point and end-point, -1 is to finish inputing:";cin>>i>>j;if(i==-1 || j==-1) break;x->ele[i][j]=1;if(!x->isOrient) x->ele[j][i]=1;}}{int i, j;if(x->isOrient)cout<<"The oriented matrix: "<<endl;elsecout<<"The no-oriented matrix: "<<endl;for(i=0;i<x->n;i++){for(j=0;j<x->n;j++) cout<<x->ele[i][j]<<" ";cout<<endl;}}int Operators::deg_out(M *x, int i){int deg=0;for(int j=0; j<x->n; j++)if(x->ele[i][j]) deg++;return deg;}int Operators::deg_in(M *x, int i){int deg=0;for(int j=0; j<x->n; j++)if(x->ele[j][i]) deg++;return deg;}void Operators::MatrixMultiple(M *a, M *b, M *temp){int i,j,k;for(i=0;i<a->n;i++)for(j=0;j<b->n;j++)for(k=0;k<a->n;k++)temp->ele[i][j]+=a->ele[i][k]*b->ele[k][j];for(i=0;i<a->n;i++)for(j=0;j<b->n;j++)b->ele[i][j]=temp->ele[i][j];}void Operators::MatrixAdd(M *a, M *b){int i,j;for(i=0;i<a->n;i++)for(j=0;j<b->n;j++)a->ele[i][j]+=b->ele[i][j];}void Operators::Maccessibility(M *a, M *Ma){int i,j;M p, temp;CreateMatrix2(&p, a->n, a->isOrient);CreateMatrix2(&temp, a->n, a->isOrient);MatrixAdd(&p, a);MatrixAdd(Ma, a);for(i=0; i<=a->n; i++){MatrixMultiple(a, &p, &temp);MatrixAdd(Ma, &p);}Show(&p);Show(Ma);for(i=0;i<Ma->n;i++)for(j=0;j<Ma->n;j++)if(Ma->ele[i][j]) Ma->ele[i][j]=1;}void main(){Operators o;M x, y;o.CreateMatrix(&x);o.CreateMatrix2(&y, x.n, x.isOrient);o.Input(&x);o.Show(&x);int i;cout<<endl<<"The deg-out for the points"<<endl;for(i=0;i<x.n;i++)cout<<i<<":"<<o.deg_out(&x,i)<<" ";cout<<endl<<"The deg-in for the points"<<endl;for(i=0;i<x.n;i++)cout<<i<<":"<<o.deg_in(&x,i)<<" ";cout<<endl;o.Maccessibility(&x, &y);o.Show(&y);}。
计算机科学与技术 离散数学 补:矩阵的定义与运算
②若n阶方阵A,有AT = A,即aij a ji (i, j 1,, n) 则称A为对称方阵(简称对称阵),其元素以主
对角线为对称轴,对应相等
例 已知 A 2
1
0 3
1, 2
1 B 4
2
7 2 0
1 3 ,
求(AB)T
1
解法1: AB 2
1
0 3
21
1 4 2
7 2 0
1 3 1
cm1 cm2 cmn mn
第i行
ai1
ai2
ais
ms
b1 j b2 j
bsj
第j列 sn
cij cij ai1b1 j ai2b2 j aisbsj
mn
第i行第j列
(行乘列规则)
例如
C AB 3 2
2 1
2 1
23
2 4 1
2 4 1
2 1 3
16 9
14 8
2 BA 4
1
2 1 3
3 2
2 1
2 1
10 14 9
6 9 5
6 9 5
n阶方阵的幂
定义 设n阶方阵A,则k个A的乘积称为A的k次幂, 记作Ak
即 A0 En,A1 A,A2 A A,,
Ak A AA,Ak1 Ak A,
解:3A
2B
3 6
9 3
6 15
0 2 0 8
4 0
0 2
6 1 5 6 6 0 2 3 13 0
0 9 6 12 4 2 0 6 4 7 6 6
3.矩阵的乘法
例
a11
a21
a12 a22
a13 a23
离散数学矩阵运算规律和应用
离散数学矩阵运算规律和应用矩阵是离散数学中的一个重要概念,广泛应用于各个领域。
矩阵的运算规律是研究矩阵性质和解决实际问题的基础。
本文将从定义、运算规律和应用三个方面详细介绍离散数学中矩阵运算规律的相关知识。
一、矩阵的定义矩阵是由m行n列元素排列成的矩形阵列,记作A=[aij],其中1≤i≤m,1≤j≤n。
矩阵的每个元素aij称为矩阵A的第i行第j列元素。
二、矩阵的运算规律1. 加法运算:矩阵相加时,要求两个矩阵的行数和列数相等。
对应位置的元素相加,得到新的矩阵。
2. 乘法运算:矩阵相乘时,要求第一个矩阵的列数等于第二个矩阵的行数。
按照阿基米德定律,逐个计算新矩阵的元素。
3. 数乘运算:将矩阵中的每个元素都乘以一个标量,得到新的矩阵。
4. 转置运算:将矩阵的行列互换,得到新的矩阵。
即A的转置记作AT。
5. 逆运算:若矩阵A存在逆矩阵A-1,满足AA-1=A-1A=I,其中I为单位矩阵。
只有方阵才存在逆矩阵。
三、矩阵运算的应用1. 线性方程组求解:可以利用矩阵运算求解线性方程组。
将线性方程组的系数矩阵和常数矩阵进行运算,得到方程组的解。
2. 网络图论:网络图论中的节点之间的连接可以用矩阵表示,利用矩阵运算可以分析网络的连通性、最短路径等问题。
3. 数据处理:在数据处理中,经常需要对数据进行矩阵运算,例如矩阵的加权平均、数据的降维等。
4. 图像处理:图像可以看作是一个二维矩阵,图像处理中常用的滤波器、旋转等操作都可以通过矩阵运算实现。
5. 人工智能:在神经网络和机器学习中,矩阵运算被广泛应用于模型的训练和预测过程中。
综上所述,离散数学中的矩阵运算规律和应用广泛且重要。
正确理解和应用矩阵运算规律,对于解决实际问题具有重要的意义。
无论是在学术研究还是工程实践中,对矩阵运算规律的熟练掌握和灵活应用都是必不可少的。
通过不断学习和实践,我们可以进一步提高对离散数学矩阵运算规律的理解和运用水平,为实际问题的解决提供更有效的方法和思路。
离散数学 图论-矩阵表示
8
小结
无向图的关联矩阵 有向图的关联矩阵 有向图的邻接矩阵
– 幂运算求长度L的通路数
有向图的可达矩阵
– 邻接矩阵A的n-1次幂An-1得到
9
主对角线的元素值为图中结点vi长度为1 的环的条数。
4
利用A(D)确定D中长度为L的通路数和回路数,就需要用到邻接矩 阵的幂次运算
(4)A2中的元素值bij是结点vi到vj长度为2 的通路条数;
说明:由矩阵的乘积定义 bij = ∑k aik * akj 由此可推断,
A3矩阵中的cij元素值,表示从 vi到vj 到长度恰为3的通路数;
∑j mij = d(vi) (i = 1,2,…,n) 5) 所有行的和(即矩阵所有元素之和)等于边数的2倍
M(G)= 0 1 1 0 0 00011 00001
∑d(vi)=∑∑mij= 2m, (即各顶点的度数之和等于边数的2倍) .
6)第j列与第k列相同,当且仅当边ej与ek是平行边.
7)∑j mij =0,第i行元素和为0,当且仅当vi是孤立点,
∑j mij= 0,j=1,2,…,m,从而 ∑∑mij=0 这说明M(D)中所有元素之和为0 (2) M(D)中,负1的个数等于正1的个数,都等于
边数m,这正是有向图握手定理的内容(入 度之和等于出度之和)
(3)第i行中,正1的个数等于d+(vi)(结点的出度 ),负1的个数等于d-(vi)(结点的入度).
(4)平行边所对应的列相同
v1
v4
e2
e1
e5
e3 e4
v2
v3
-1 1 0 0 0 M(D)= 1 -1 1 0 0
0 0 011 0 0 -1 -1 -1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int** g(int n)
{
int** a, i, j;
a = new int* [n];//分配指针数组
for(i=0; i<n; i++)
a[i] = new int[n];//分配每个指针所指向的数组
for(i=0; i<n; i++)
for(j=0; j<n; j++) a[i][j]=0;
return a;
}
struct M
{
int n;
int isOrient;
int **ele;
};
class Operators
{
public:
void CreateMatrix(M *x);
void CreateMatrix2(M *x, int n, int isOrient);
void Input(M *x);
}
}
void Operators::Show(M *x)
{
int i, j;
if(x->isOrient)
cout<<"The oriented matrix: "<<endl;
o-oriented matrix: "<<endl;
for(i=0;i<x->n;i++)
while(1)
{
cout<<"Input the edge's start-point and end-point, -1 is to finish inputing:";
cin>>i>>j;
if(i==-1 || j==-1) break;
x->ele[i][j]=1;
if(!x->isOrient) x->ele[j][i]=1;
for(i=0;i<x.n;i++)
cout<<i<<":"<<o.deg_out(&x,i)<<" ";
cout<<endl<<"The deg-in for the points"<<endl;
for(i=0;i<x.n;i++)
cout<<i<<":"<<o.deg_in(&x,i)<<" ";
};
void Operators::CreateMatrix2(M *x, int n, int isOrient)
{
x->n=n;
x->isOrient=isOrient;
x->ele=g(x->n);
}
void Operators::CreateMatrix(M *x)
{
int n, isOrient;
}
void Operators::MatrixAdd(M *a, M *b)
{
int i,j;
for(i=0;i<a->n;i++)
for(j=0;j<b->n;j++)
a->ele[i][j]+=b->ele[i][j];
}
void Operators::Maccessibility(M *a, M *Ma)
{
MatrixMultiple(a, &p, &temp);
MatrixAdd(Ma, &p);
}
Show(&p);
Show(Ma);
for(i=0;i<Ma->n;i++)
for(j=0;j<Ma->n;j++)
if(Ma->ele[i][j]) Ma->ele[i][j]=1;
}
void main()
cout<<"Matrix's n=";
cin>>n;
cout<<"Is the graph oriented? 1=yes, 0=no :";
cin>>isOrient;
CreateMatrix2(x, n, isOrient);
}
void Operators::Input(M *x)
{
int i, j;
{
Operators o;
M x, y;
o.CreateMatrix(&x);
o.CreateMatrix2(&y, x.n, x.isOrient);
o.Input(&x);
o.Show(&x);
int i;
cout<<endl<<"The deg-out for the points"<<endl;
{
for(j=0;j<x->n;j++) cout<<x->ele[i][j]<<" ";
cout<<endl;
}
}
int Operators::deg_out(M *x, int i)
{
int deg=0;
for(int j=0; j<x->n; j++)
if(x->ele[i][j]) deg++;
return deg;
}
int Operators::deg_in(M *x, int i)
{
int deg=0;
for(int j=0; j<x->n; j++)
if(x->ele[j][i]) deg++;
return deg;
}
void Operators::MatrixMultiple(M *a, M *b, M *temp)
void Show(M *x);
int deg_out(M *a, int i);
int deg_in(M *a, int i);
void Maccessibility(M *a, M *Ma);
void MatrixMultiple(M *a, M *b, M *m);
void MatrixAdd(M *a, M *b);
{
int i,j,k;
for(i=0;i<a->n;i++)
for(j=0;j<b->n;j++)
for(k=0;k<a->n;k++)
temp->ele[i][j]+=a->ele[i][k]*b->ele[k][j];
for(i=0;i<a->n;i++)
for(j=0;j<b->n;j++)
b->ele[i][j]=temp->ele[i][j];
cout<<endl;
o.Maccessibility(&x, &y);
o.Show(&y);
}
{
int i,j;
M p, temp;
CreateMatrix2(&p, a->n, a->isOrient);
CreateMatrix2(&temp, a->n, a->isOrient);
MatrixAdd(&p, a);
MatrixAdd(Ma, a);
for(i=0; i<=a->n; i++)
实验四
实验目的
学习图在计算机中的矩阵表示,并能利用课堂所学知识进行出度和入度的计算。
实验内容与要求
根据输入的整数对,输出一个图形的邻接矩阵。并求出各结点的出度和入度。
实验准备
图可以用多种方式来表示,其中邻接矩阵是一种较简单的方式。复习关于邻接矩阵的描述。明确一下内容:
1.如何使用邻接矩阵表示图。
2.利用图的邻接矩阵求结点的出度和入度的方法。