第七章、图
❗7.1、图的定义和基本术语
7.1.1、定义
1、图

❗1、完全图

2、邻接()是无向图,<>是有向图、稠密图、稀疏图、网、关联(依附)

3、度
①有几个边就是几个度
②如图

4、有向树
①有且仅有1个顶点的入度(指向它的)
②其余顶点的入度均为1
③出度没限制
④就是有向树
5、路径相关概念

6、连通图(强连通图是有向图)
(1)任意两点都找到路径是连通图

7、权与网

8、子图

9、连通分量(强连通分量)
(1)连通子图,是子图,也两点任意访问
(2)极大连通:是指该顶点已经最大了,再加子图就不连通了
(3)无向图

(4)有向图

10、极小连通子图
(1)与极大连通子图对应
11、生成树
(1)包含无向图G所有定点的极小连通子图

7.2、案例引入
7.2.1、六度空间理论

7.3、图的类型定义
7.3.1、图的抽象数据类型定义
1、定义

2、操作

❗7.4、图的存储结构
1、介绍

❗7.4.1、数组(邻接矩阵)表示法
1、如果存在关系则用1表示,否则为0

2、无向图的邻接矩阵图
①有几个顶点,就有i*j的矩阵
②矩阵的对角线是0,因为都表示自己

3、有向图的邻接矩阵表示法
①有几个顶点,就有i*j的矩阵
②矩阵的对角线是0,因为都表示自己
③i行和j列的含义

④分析1:有向图的邻接矩阵可能不是对称的(除非是完全图)
⑤分析2:

⑥出度:该结点指向的方向(箭头出发的方向)
⑦入度:其他结点指向自己
4、网(即有权图)的邻接矩阵表示法

2、邻接矩阵的存储
1、两个数组分别存储顶点表和接邻矩阵
2、存储结构

3、思路

3、java实现代码
1、无向图邻接矩阵
import java.util.ArrayList;
import java.util.Arrays;
public class Graph {
public static void main(String[] args) {
int n = 5;//节点个数
String vertextValue[] = {"A","B","C","D","E"};
//创建对象
Graph graph = new Graph(n);
//循环添加顶点
for(String value : vertextValue){
graph.inserVetex(value);
}
//添加边
graph.install(0,1,1);
graph.install(0,2,1);
graph.install(1,2,1);
graph.install(1,3,1);
graph.install(1,4,1);
//显示邻接矩阵
graph.showGraph();
}
private ArrayList<String> vertexList;//设置存储节点的集合
private int [][] edges;//用来存储矩阵
private int numOfEdges;//存储节点的边数
//构造器
public Graph(int n ){
//初始化c存储矩阵
edges = new int[n][n];
vertexList = new ArrayList<>(n);//设置n个节点集合
numOfEdges = 0;
}
//显示图对应的矩阵
public void showGraph(){
for(int[] link :edges){
System.out.println(Arrays.toString(link));
}
}
//得到顶点的个数
public int getNumOfVertex(){
return vertexList.size();
}
//得到边的数目
public int getNumOfEdges(){
return numOfEdges;
}
//得到节点i(下标)对应的数据
public String getValueByIndex(int i){
return vertexList.get(i);
}
//添加边
public void install(int v1 ,int v2,int weight){//v1是第一个顶点,v2是第二个顶点
edges[v1][v2] = weight;
edges[v2][v1] = weight;
numOfEdges++;
}
//添加顶点
public void inserVetex(String vertex){
vertexList.add(vertex);
}
}
4、采用连接矩阵表示法的创建无向图
5、邻接矩阵的优点
(1)有向表中:行—出度
(2)有向表中:列—入度

6、邻接矩阵的缺点

❗7.4.2、邻接表表示法(链式)
1、分析

2、无向图的邻接表
1、计算无向表的度,通过有多少个表结点
2、存放的位置不怕
3、特点

3、有向图的邻接表
1、有几个表结点,就有几个出度
2、找入度需要遍历
3、出度容易入度难

逆邻接表
y①有几个表结点,就有几个入度
②找出度需要遍历,找到邻接点是0的
③入度容易出度难
④如图

4、练习题

5、图的邻接表存储结构
1、顶点的结点结构

2、弧(边)的结点结构

3、图的结点定义

6、邻接表代码思路

7、java代码实现
8、邻接表的优点和缺点

9、邻接矩阵和邻接表表示法的关系
1、联系

2、区别

7.4.3、十字链表、邻接多重表

1、解析(十字链表)

2、解析(邻接多重表)
1、边结点画在哪不重要

❗7.5、图的遍历
7.5.1、定义
1、从已给连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每一个顶点被访问一次,就叫做图的遍历。
2、遍历是图的基本运算
3、遍历实质:找到每个顶点的邻接点的过程
7.5.2、特点

7.5.3、图的常用遍历
7.5.3、深度优先搜索(Depth_First Search—DFS)
1、方法

1、一条路走到黑,到了尽头,回退。直到回退到起始顶点。
2、例子

3、邻接矩阵表示的无向图深度遍历实现
1、解析

2、代码

3、java代码实现
4、DFS算法效率分析

5、非连通图的遍历

7.5.4、广度优先搜素(Breadth_First Search—BFS)
1、方法

1、是一圈一圈的遍历
2、非连通图的遍历

3、邻接表实现
1、思路
2、实现
4、BFS算法效率
5、DFS和BFS算法效率比较
7.6、图的应用
7.6.1、最小生成树
1、概念
1、最小生成树:所有顶点均由边连接在一起,且不形成回路。
2、特点
(1)含n个顶点n-1条边的图不一定是生成树,(也可能是森林)
2、无向图的生成树

3、最小生成树

4、最小生成树的典型例子

5、构造最小生成树Minimum Spanning Tree
1、性质

2、对MST性质的解释

6、最小生成树算法之一—普里姆(Prim)算法
1、算法思路

7、最小生成树算法之一—克鲁斯卡尔(Kruskal)算法
1、算法思路

8、两种算法的比较

7.6.2、最短路径
1、介绍
1、问题抽象

2、第一类问题:两点间的最短路径

3、第二类问题:某源点到其他各点最短路径

4、最短路径算法—Dijistra算法

7.7、案例分析与实现
未完待续