提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、数组表示法(邻接矩阵):
图没有顺序存储结构,但可以借助二维数组来表示元素间的关系
(1)建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。
(2)设图A=(V, E)有n个顶点,则谢顶点表
i | 0 | 1 | 2 | ... | n-1 |
Vexs[i] | V1 | V2 | V3 | ... | Vn |
(3)图的邻接矩阵是一个二维数组 A.arcs[n][n],定义为:
{ 1,如果<i,j> 属于 E 或者(i,j)属于E
A.arcs(ij)=
{ 0,否则
1.无向图的邻接矩阵表示法
邻接矩阵A.arcs[i][j]
V1 | V2 | V3 | V4 | V5 | |
V1 | 0 | 1 | 0 | 1 | 0 |
V2 | 1 | 0 | 1 | 0 | 1 |
V3 | 0 | 1 | 0 | 1 | 1 |
V4 | 1 | 0 | 1 | 0 | 0 |
V5 | 0 | 1 | 1 | 0 | 0 |
无向图的邻接矩阵的特点
1.无向图的邻接矩阵是对称的。
2.顶点i的度=第 /行 (列) 中1 的个数。
3.完全图的邻接矩阵中,对角元素为0,其余1。
2.有向图的邻接矩阵表示法
邻接矩阵
V1 | V2 | V3 | V4 | |
V1 | 0 | 1 | 1 | 0 |
V2 | 0 | 0 | 0 | 0 |
V3 | 0 | 0 | 0 | 1 |
V4 | 1 | 0 | 0 | 0 |
有向图的邻接矩阵的特点
(1)有向图的邻接矩阵可能是不对称的。
(2)顶点的出度=第i行元素之和
(3)顶点的入度=第i列元素之和
(4)顶点的度=第i行元素之和+第i列元素之和
注意:
第 i 行含义:出度边
第 i 列含义:入度边
3.网(即有权图)的邻接矩阵表示法
{ Wij < vi, vj > 或 (vi,vj) 属于VR
定义为:A. arcs[i][j]=
{ ∞ 无边(弧)
邻接矩阵
V1 | V2 | V3 | V4 | V5 | V6 | |
V1 | 无穷 | 5 | 无穷 | 7 | 无穷 | 无穷 |
V2 | 无穷 | 无穷 | 4 | 无穷 | 无穷 | 无穷 |
V3 | 8 | 无穷 | 无穷 | 无穷 | 9 | |
V4 | 无穷 | 无穷 | 5 | 无穷 | 无穷 | 6 |
V5 | 无穷 | 无穷 | 无穷 | 5 | 无穷 | 无穷 |
V6 | 3 | 无穷 | 无穷 | 无穷 | 无穷 | 无穷 |
4.邻接矩阵的存储表示:
用两个数组分别存储顶点表和邻接矩阵
#define MVNum 100 //最大顶点数
typedef char VerTexType; //设顶点的数据类型为字符型
typedef int ArcType; //假设边的权值类型为整型
typedef struct
{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum, arcnum; //图的当前点数和边数
}
JAMGraph; // Adjacency Matrix Gra
采用邻接矩阵表示法创建无向网
Status CreateUDN(AMGraph &G)
{ //采用邻接矩阵表示法,创建无向网
Gcin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
for(i = 0; i<G.vexnum; ++i)
cin>>G.vexs[i]; //依次输入点的信息
for(i = 0; i<G.vexnum;++i) //初始化邻接矩阵
for(j = 0; j<G.vexnum;+ +j)
G.arcs[i][j] = MaxInt; //边的权值均置为极大值
for(k =0; k<G.arcnum;++k)
{ //构造邻接矩阵
cin>>v1>>v2>>W; //输入一条边所依附的顶点及边的权值
i = LocateVex(G, 1);
j= LocateVex(G, v2); //确定v1和v2在G中的位置
G.arcs[i][j]= w; //边<v1,v2>的权值置为w
G.arcs[j][i]= G.arcs[i][j]; //置<v1,v2>的对称边<v2,v1>的权值为w
} //for
return OK;
} //CreateUDN
5.邻接矩阵的优缺点
优点
(1)直观、简单、好理解
(2)方便检查任意一对顶点间是否存在边
(3)方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
(4)方便计算任一顶点的“度”(从该点发出的边数为“出度”,指向该点的边数为“入度”)
无向图:对应行(或列)非0元素的个数
有向图:对应行非0元素的个数是“出度对应列非0元素的个数是“入度”
缺点
(1)不便于增加和删除顶点
(2)浪费空间:传稀疏图点很多而边很少)有大量无效元素
(特别是完全图)还是很合算的对稠密图
(3)浪费时间:统计稀疏图中一共有多少条边
链式储结构:
1.邻接表表示法(链式)
顶点:
按编号顺序将顶点数据存储在一维数组中
关联同一顶点的边(以顶点为尾的弧)
用线性链表存储
头结点
数据元素 | 指针(第一个边结点指针) |
表结点
连接的顶点 | 下一个边结点 |
链域
指示下一条边或弧
2.无向图邻接表特点:
(1)邻接表不唯一
(2)若无向图中有 n个顶点、e条边,则其邻接表需 几个头结点和2e个
表结点。适宜存储稀疏图
3.有向图邻接表特点:
(1)顶点 V i 的出度为第i个单链表中的结点个数。
(2)顶点 Vi的入度为整个单链表中邻接点域值是 i-1 的结点个数。
(3)顶点 Vi的入度为第i个单链表中的结点个数。
(4)顶点 Vi的出度为整个单链表中邻接点域值是 i-1 的结点个数。
总结
以上内容为大家介绍了图的应用方法和技巧。感谢各位的耐心观看,如果以上内容对大家学习有所帮助的话,希望大家可以点赞支持一下!