1、图的基本定义和基本术语
有向图:每条边都是有方向的
无向图:每条边都是无方向的
完全图:任意两个点都有一条边相连
稀疏图:有很少边或弧的图(e<nlogn)
稠密图:有较多边或弧的图
网:边/弧带权的图
邻接:有边或弧相连的两个顶点之间的关系。
关联(依附):边或弧与顶点之间的关系
顶点的度:与该顶点相关联的边的数目
-
在有向图中,顶点的度等于该顶点的入度与出度之和。
路径: 连续的边构成的顶点序列
路径长度:路径上边或弧的数目/权值之和
回路(环):第一个顶点和最后一个顶点相同的路径
简单路径:除路径起点和终点可以相同外,其余顶点均不相同的路径
简单回路(简单环):除路径起点和终点相同外,其余顶点均不相同的路径
权与网:
图中边或弧所具有的相关数称为权,表明从一个顶点到另一个顶点的距离或耗费
带权的图称为网
2、图的存储结构
2.1 邻接矩阵
数组(邻接矩阵)表示法
()无方向不区分起始端点和终止端点<>有向i(弧尾)-->j(弧头)i出发指向j
邻接表示两个顶点之间的关系:(有边/弧相连的两个顶点之间的关系)
特别:完全图的邻接矩阵中,对角元素为0,其余为1
# define MaxInt 32767 // 表示极大值,即无穷大
# define MVNum 100 // 最大定点数
typedef char VerTexType; // 设顶点都数据类型为字符 型
typedef int ArcType; // 假设边的权值类型为整型
typedef struct{
VerTexType vexs[MVNum]; // 顶点表
ArcType arcs[MVNum][MVNum]; // 邻接矩阵
int vexnum,arcnum; // 图的当前点数和边数
}AMGraph;
(1)输入了顶点数和边数就可以确定输入一维数组的顶点信息和邻接矩阵的边的关系的循环次数
(3)涉及循环的嵌套(有行有列)如果有边将值改为权
G是函数的参数同时接受函数的返回值(函数直接对参数进行一些操作)
G有4个成员(2个数组、2个信息)
访问成员的方式 结构体变量名.成员名
指向结构体变量的指针名->成员名
2.2 邻接表
2.3 十字链表
tailvex:弧尾的位置
headvex:弧头的位置
hlink:弧头相同的下一条弧
tlink:弧尾相同的下一条弧
2.4 邻接多重表
3、图的遍历
遍历定义:从已给的连通图中某一顶点出发,沿着一些边,访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,他是图的基本运算。
图的特点:图中可能存在回路,且图中的任一顶点都可能与其他顶点相通,在访问完某一个顶点以后可能会沿着某些边又回到了曾经访问过的顶点。
图常用的遍历方法:
-
深度优先搜索(DFS)
-
广度优先搜索(BFS)