【梳理】离散数学 第14章 图的基本概念 14.4 图的矩阵表示 14.5 图的运算

本文详细介绍了离散数学中图的矩阵表示,包括无向图的关联矩阵、有向无环图的关联矩阵和有向图的邻接矩阵,以及这些矩阵的性质。此外,还阐述了图的运算,如并图、差图、交图和环和,并给出了相关性质和证明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

教材:《离散数学》第2版 屈婉玲 耿素云 张立昂 高等教育出版社
源文档高清截图在最后

14.4 图的矩阵表示

1、图可以用集合来定义,但多用图形表示,还可以用矩阵来表示。用矩阵表示图便于用代数方法研究图的性质。图可以用关联矩阵、邻接矩阵或可达矩阵来表示。

2、设无向图G(V, E),V = {v1,v2,……,vn},E = {e1,e2,……,em}。则可构造G的关联矩阵M(G) = {mi, j}n×m。mi, j代表顶点vi和边ej的关联次数。
不难发现,无向图的关联矩阵M(G)的性质有:
(1)每列元素之和均为2。这是因为每条边恰好关联两个顶点(环关联一个顶点2次)。
(2)每行元素之和为对应顶点的度数。
(3)在这里插入图片描述 。这正是握手定理的内容。
(4)第j列与第k列相同当且仅当边ej与ek是平行边(重边)。
(5)某行元素之和 在这里插入图片描述为0当且仅当点vi是孤立点。

3、设有向无环图D(V, E),V = {v1,v2,……,vn},E = {e1,e2,……&

好资源#include #include #include using namespace std; //表结点 typedef struct ArcNode{ int adjvex;//该弧所指向的顶点的位置 ArcNode *nextarc;//指向下一条弧的指针 }ArcNode; //头结点 typedef struct VNode{ string data;//顶点信息 ArcNode* firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针 }VNode, AdjList[10]; typedef struct{ AdjList vertices; int vexnum, arcnum;//的顶点数和弧数 }ALGraph; int LocateVex(ALGraph G, string u)//返回顶点u在中的位置 { for(int i=0; i<G.vexnum; i++) if(G.vertices[i].data==u) return i; return -1; } void CreateUDG(ALGraph &G)//构造无向 { string v1, v2; int i, j, k; cout<>G.vexnum>>G.arcnum; cout<<"请输入顶点:"; for(i=0; i>G.vertices[i].data; G.vertices[i].firstarc=NULL; } cout<<"请输入边:"; cout<<endl; for(k=0; k>v1>>v2; i=LocateVex(G, v1); j=LocateVex(G, v2); //插入v1的邻接表,为了提高效率,总在表头插入结点。 ArcNode *arc=new ArcNode; arc->adjvex=j; arc->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=arc; //插入v2的邻接表,为了提高效率,总在表头插入结点。 arc=new ArcNode; arc->adjvex=i; arc->nextarc=G.vertices[j].firstarc; G.vertices[j].firstarc=arc; } } void Print(ALGraph G)//打印邻接表 { cout<<"打印邻接表如下:"; cout<<endl; for(int i=0; i<G.vexnum; i++)//遍历每个顶点的邻接表 { cout<<G.vertices[i].data; ArcNode *p=G.vertices[i].firstarc; while(p) { cout<"<adjvex].data; p=p->nextarc; } cout<adjvex; else return -1; } int NextAdjVex(ALGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接点序号 { ArcNode* p=G.vertices[v].firstarc; while(p) { if(p->adjvex==w) break; p=p->nextarc; } if(p->adjvex!=w || !p->nextarc)//如果没找到w或者w是最后一个邻接点 return -1; return p->nextarc->adjvex; } bool visited[10]; void DFS(ALGraph G, int v) { visited[v]=true; cout<<G.vertices[v].data<=0; w=NextAdjVex(G, v, w) ) if(!visited[w]) DFS(G, w); } void DFSTraverse(ALGraph G)//深搜 { for(int i=0; i<G.vexnum; i++) visited[i]=false; for(i=0; i<G.vexnum; i++) if(!visited[i]) DFS(G, i); } void BFSTraverse(ALGraph G)//广搜 { queue q; for(int i=0; i<G.vexnum; i++) visited[i]=false; for(i=0; i<G.vexnum; i++) { if(!visited[i]) { q.push(i); visited[i]=true; while(!q.empty()) { int v=q.front(); q.pop(); cout<<G.vertices[v].data<=0; w=NextAdjVex(G, v, w)) { if (!visited[w]) { q.push(w); visited[w]=true; } } } } } } void main() { ALGraph G; CreateUDG(G); Print(G); cout<<"深搜:"; DFSTraverse(G); cout<<endl; cout<<"广搜:"; BFSTraverse(G); cout<<endl; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值