第07章 图(Java版)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图7.12
《数据结构(Java版)(第4版)》第7章 15
30 99 50 40 0 10 20 0 60 0
习题7-15 G7的邻接矩阵表示
习题解答
习题7-15 删除G7的顶点D
A B C D E F G H
(a)4个顶点具有最少边数的无向连通 图,有线性和树两种形态
(b)4个顶点具有最少边数的 有向强连通图
《数据结构(Java版)(第4版)》第7章 9
7.1.2 图抽象数据类型
ADT Graph<T> { int vertexCount() T getVertex(int i) void setVertex(int i, T x) int insertVertex(T x); void removeVertex(int v) int next(int i, int j); //图抽象数据类型 //顶点数 //顶点vi元素 //设置vi顶点为x //插入顶点 //删除顶点 //后继邻接顶点
7.2.1 图的邻接矩阵表示和实现 7.2.2 图的邻接表表示和实现
7.2.3 图的邻接多重表表示
《数据结构(Java版)(第4版)》第7章 11
7.2.1 图的邻接矩阵表示和实现
1. 邻接矩阵
① 不带权图的邻接矩阵
ai , j
A D
1 若(vi , v j ) E或 vi , v j E 0 若(vi , v j ) E或 vi , v j E
《数据结构(Java版)(第4版)》第7章 1
7.1 图及其抽象数据类型
7.1.1 图的基本概念
1. 图的定义和术语 G=(V, E)
V={vi| vi ∈某个数据元素集合} E={(vi ,vj)|vi ,vi∈V} 或E = {〈vi ,vi〉|vi ,vi,∈V且Path} ① 无向图 ② 有向图
0 12 31
12 0 23
31 0 15
23 15 0 11 4
11 0 5 27
4 5 0 63 17
பைடு நூலகம்27 63 0 18
17 18 0
A B C V D E F
0 1 C F 1 A 1 B E 0 0 图7.9 无向图G1及其邻接矩阵表示
1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0
13 11 0
图7.11 带权无向图G3的邻接矩阵表示
《数据结构(Java版)(第4版)》第7章 14
带权有向图G4的邻接矩阵表示
0 10 A 0 B V C A D E
A
D
28 12
… 10 ∞ 17
length-1 ∞ 21 26 15
《数据结构(Java版)(第4版)》第7章 22
(1)插入边(2)插入顶点
//插入边,权值为weight public void insertEdge(int i, int j, int weight) public void insertEdge(Triple edge) public int insertVertex(T x) //插入元素为x的顶点,返回x顶点序号
(2)带权图的邻接矩阵
ai , j wi , j 若vi v j 且(vi , v j ) E或 vi , v j E 若vi v j 且(vi , v j ) E或 vi , v j E 0 若vi v j 0 45 28 10 A 45 0 12 21 B 28 12 0 17 26 C V A 10 17 0 15 D 21 26 15 0 E 13 11 F
《数据结构(Java版)(第4版)》第7章 21
【例7.1】 带权图的存储及操作。
//G3的顶点集合、边集合(除F) String[] vertices={"A","B","C","D","E"}; Triple edges[]={new Triple(0,1,45), …… };
顶点顺序表 0 10 28 45 12 1 B 21 2 C 26 E 4 17 15 3 vertexlist 0 1 2 … length-1 A B C D E 0 1 2 邻接矩阵 matrix 0 0 45 1 0 2 … length-1 45 28 10 ∞ 12 ∞ 21 0 17 26 0 15 0
28 12
10 ∞ 17
… ∞ 21 26 15 … length-1
i=n-1 ∞ ∞ ∞ 13 11
图7.15 带权无向图G3及其邻接矩阵存储结构
void insertEdge(int i, int j, int weight) //插入边 void removeEdge(int i, int j) //删除边 int weight(int i, int j) //边的权值 }
《数据结构(Java版)(第4版)》第7章 10
7.2 图的表示和实现
顶点的度是入度与出度之和。
《数据结构(Java版)(第4版)》第7章 5
2.顶点的度
度之和与边数的关系
① 无向图 ② 有向图
n i 1
n
1 e degree(vi ) 2 i1
n i i 1 i
n
indegree(v ) outdegree(v ) e
degree(v ) indegree(v ) outdegree(v ) 2e
《数据结构(Java版)(第4版)》第7章 17
//图的顶点数 //图的顶点集合描述 //顶点元素 //设置顶点元素为x
2. 表示顶点集合的抽象图类
public abstract class AbstractGraph<T> //抽象图类 { //以下抽象方法没有方法体,由子类提供实现 public abstract int insertVertex(T x); //插入顶点 public abstract void removeVertex(int i); //删除顶点及边 public abstract int weight(int i, int j); //边的权值 protected abstract int next(int i, int j); //后继邻接顶点 }
《数据结构(Java版)(第4版)》第7章 12
有向图G2及其邻接矩阵表示
A 0 B 0 V C A 0 D 0 E 0
图7.10
《数据结构(Java版)(第4版)》第7章 13
1 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0
public int compareTo(Triple tri) //按行、列位置比较大小,约定排序次序
}
《数据结构(Java版)(第4版)》第7章 20
4. 邻接矩阵表示的带权图类
public class MatrixGraph<T>
extends AbstractGraph<T>
{
protected Matrix matrix; //存储图的邻接矩阵
(a) 带权无向图G3
(b) 带权有向图G4
《数据结构(Java版)(第4版)》第7章 4
③ 邻接顶点
2.顶点的度
E
A B F G C D X H
顶点的度是指与顶点关联的边数。度为0的称为 孤立点,度为1的称为悬挂点。 与树中结点度的区别。 有向图,以vi为终点的边数称为vi的入度;以vi 为起点的边数称为vi的出度。
《数据结构(Java版)(第4版)》第7章 2
多重图,简单图
图7.2 多重图和带自身环的图
《数据结构(Java版)(第4版)》第7章 3
③ 完全图
④ 带权图
A 28 45 12 B 21 C 26 E 11 10 17 15 D 10 13 F B 50 C 40 10 20 D A 30 99 E 60
public MatrixGraph(int length) public MatrixGraph() public MatrixGraph(T[] vertices) public MatrixGraph(T[] vertices, Triple[] edges) //顶点集和边集构造图 public String toString() //图的描述 }
《数据结构(Java版)(第4版)》第7章 23
带权无向图G3插入顶点F及边
vertexlist 0 A 28 45 12 1 B 21 2 C 26 E 4 11 10 17 15 D 3 13 F i= 5 0 1 2 3 … i=n-1 … length-1 A B C D E F matrix 0 0 1 2 3 0 45 1 0 2 3 … i=n-1… length-1 45 28 10 ∞ ∞ 12 ∞ 21 ∞ 0 17 26 ∞ 0 15 13 0 11 0
《数据结构(Java版)(第4版)》第7章 16
2. 表示顶点集合的抽象图类
public abstract class AbstractGraph<T> //抽象图类 { protected static final int MAX_WEIGHT=0x0000ffff; //∞ protected SeqList<T> vertexlist; //顶点顺序表 //构造空图,顶点数为0,length指定顶点顺序表容量 public AbstractGraph(int length) public AbstractGraph() public int vertexCount() public String toString() public T getVertex(int i) public void setVertex(int i, T x) }
i 1 i i 1 i i 1 i
《数据结构(Java版)(第4版)》第7章 6
n
n
3. 子图
《数据结构(Java版)(第4版)》第7章 7
4. 路径
5. 连通性
《数据结构(Java版)(第4版)》第7章 8
习题7-4
1. n(=4)个顶点具有最少边数的无向连通 图和有向强连通图是怎样的? //习题解答
7.1 图及其抽象数据类型 7.2 图的表示和实现 7.3 图的遍历 7.4 最小生成树 7.5 最短路径 目的:理解图结构。 要求:掌握图的存储结构和操作实现。
第 7章
图
重点:图的两种存储结构,遍历算法,最小生 成树,最短路径。 难点:图的存储和操作实现,最小生成树, 最短路径。
《数据结构(Java版)(第4版)》第7章 18
AbstractGraph<T>抽象图类 及其子类的层次关系
AbstractGraph<T> 抽象图类 继承 MatrixGraph<T> 邻接矩阵表示的图类 继承 AdjListGraph<T> 邻接表表示的图类
图7.13
《数据结构(Java版)(第4版)》第7章 19
3. 图带权值的边类
(1)带权值的边 图的边(起点序号,终点序号,权值) //矩阵非零元素三元组(5.2.2节) ,图带权值的边类 public class Triple implements Comparable<Triple> { int row, column, value; //行、列、元素
《数据结构(Java版)(第4版)》第7章 15
30 99 50 40 0 10 20 0 60 0
习题7-15 G7的邻接矩阵表示
习题解答
习题7-15 删除G7的顶点D
A B C D E F G H
(a)4个顶点具有最少边数的无向连通 图,有线性和树两种形态
(b)4个顶点具有最少边数的 有向强连通图
《数据结构(Java版)(第4版)》第7章 9
7.1.2 图抽象数据类型
ADT Graph<T> { int vertexCount() T getVertex(int i) void setVertex(int i, T x) int insertVertex(T x); void removeVertex(int v) int next(int i, int j); //图抽象数据类型 //顶点数 //顶点vi元素 //设置vi顶点为x //插入顶点 //删除顶点 //后继邻接顶点
7.2.1 图的邻接矩阵表示和实现 7.2.2 图的邻接表表示和实现
7.2.3 图的邻接多重表表示
《数据结构(Java版)(第4版)》第7章 11
7.2.1 图的邻接矩阵表示和实现
1. 邻接矩阵
① 不带权图的邻接矩阵
ai , j
A D
1 若(vi , v j ) E或 vi , v j E 0 若(vi , v j ) E或 vi , v j E
《数据结构(Java版)(第4版)》第7章 1
7.1 图及其抽象数据类型
7.1.1 图的基本概念
1. 图的定义和术语 G=(V, E)
V={vi| vi ∈某个数据元素集合} E={(vi ,vj)|vi ,vi∈V} 或E = {〈vi ,vi〉|vi ,vi,∈V且Path} ① 无向图 ② 有向图
0 12 31
12 0 23
31 0 15
23 15 0 11 4
11 0 5 27
4 5 0 63 17
பைடு நூலகம்27 63 0 18
17 18 0
A B C V D E F
0 1 C F 1 A 1 B E 0 0 图7.9 无向图G1及其邻接矩阵表示
1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0
13 11 0
图7.11 带权无向图G3的邻接矩阵表示
《数据结构(Java版)(第4版)》第7章 14
带权有向图G4的邻接矩阵表示
0 10 A 0 B V C A D E
A
D
28 12
… 10 ∞ 17
length-1 ∞ 21 26 15
《数据结构(Java版)(第4版)》第7章 22
(1)插入边(2)插入顶点
//插入边,权值为weight public void insertEdge(int i, int j, int weight) public void insertEdge(Triple edge) public int insertVertex(T x) //插入元素为x的顶点,返回x顶点序号
(2)带权图的邻接矩阵
ai , j wi , j 若vi v j 且(vi , v j ) E或 vi , v j E 若vi v j 且(vi , v j ) E或 vi , v j E 0 若vi v j 0 45 28 10 A 45 0 12 21 B 28 12 0 17 26 C V A 10 17 0 15 D 21 26 15 0 E 13 11 F
《数据结构(Java版)(第4版)》第7章 21
【例7.1】 带权图的存储及操作。
//G3的顶点集合、边集合(除F) String[] vertices={"A","B","C","D","E"}; Triple edges[]={new Triple(0,1,45), …… };
顶点顺序表 0 10 28 45 12 1 B 21 2 C 26 E 4 17 15 3 vertexlist 0 1 2 … length-1 A B C D E 0 1 2 邻接矩阵 matrix 0 0 45 1 0 2 … length-1 45 28 10 ∞ 12 ∞ 21 0 17 26 0 15 0
28 12
10 ∞ 17
… ∞ 21 26 15 … length-1
i=n-1 ∞ ∞ ∞ 13 11
图7.15 带权无向图G3及其邻接矩阵存储结构
void insertEdge(int i, int j, int weight) //插入边 void removeEdge(int i, int j) //删除边 int weight(int i, int j) //边的权值 }
《数据结构(Java版)(第4版)》第7章 10
7.2 图的表示和实现
顶点的度是入度与出度之和。
《数据结构(Java版)(第4版)》第7章 5
2.顶点的度
度之和与边数的关系
① 无向图 ② 有向图
n i 1
n
1 e degree(vi ) 2 i1
n i i 1 i
n
indegree(v ) outdegree(v ) e
degree(v ) indegree(v ) outdegree(v ) 2e
《数据结构(Java版)(第4版)》第7章 17
//图的顶点数 //图的顶点集合描述 //顶点元素 //设置顶点元素为x
2. 表示顶点集合的抽象图类
public abstract class AbstractGraph<T> //抽象图类 { //以下抽象方法没有方法体,由子类提供实现 public abstract int insertVertex(T x); //插入顶点 public abstract void removeVertex(int i); //删除顶点及边 public abstract int weight(int i, int j); //边的权值 protected abstract int next(int i, int j); //后继邻接顶点 }
《数据结构(Java版)(第4版)》第7章 12
有向图G2及其邻接矩阵表示
A 0 B 0 V C A 0 D 0 E 0
图7.10
《数据结构(Java版)(第4版)》第7章 13
1 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0
public int compareTo(Triple tri) //按行、列位置比较大小,约定排序次序
}
《数据结构(Java版)(第4版)》第7章 20
4. 邻接矩阵表示的带权图类
public class MatrixGraph<T>
extends AbstractGraph<T>
{
protected Matrix matrix; //存储图的邻接矩阵
(a) 带权无向图G3
(b) 带权有向图G4
《数据结构(Java版)(第4版)》第7章 4
③ 邻接顶点
2.顶点的度
E
A B F G C D X H
顶点的度是指与顶点关联的边数。度为0的称为 孤立点,度为1的称为悬挂点。 与树中结点度的区别。 有向图,以vi为终点的边数称为vi的入度;以vi 为起点的边数称为vi的出度。
《数据结构(Java版)(第4版)》第7章 2
多重图,简单图
图7.2 多重图和带自身环的图
《数据结构(Java版)(第4版)》第7章 3
③ 完全图
④ 带权图
A 28 45 12 B 21 C 26 E 11 10 17 15 D 10 13 F B 50 C 40 10 20 D A 30 99 E 60
public MatrixGraph(int length) public MatrixGraph() public MatrixGraph(T[] vertices) public MatrixGraph(T[] vertices, Triple[] edges) //顶点集和边集构造图 public String toString() //图的描述 }
《数据结构(Java版)(第4版)》第7章 23
带权无向图G3插入顶点F及边
vertexlist 0 A 28 45 12 1 B 21 2 C 26 E 4 11 10 17 15 D 3 13 F i= 5 0 1 2 3 … i=n-1 … length-1 A B C D E F matrix 0 0 1 2 3 0 45 1 0 2 3 … i=n-1… length-1 45 28 10 ∞ ∞ 12 ∞ 21 ∞ 0 17 26 ∞ 0 15 13 0 11 0
《数据结构(Java版)(第4版)》第7章 16
2. 表示顶点集合的抽象图类
public abstract class AbstractGraph<T> //抽象图类 { protected static final int MAX_WEIGHT=0x0000ffff; //∞ protected SeqList<T> vertexlist; //顶点顺序表 //构造空图,顶点数为0,length指定顶点顺序表容量 public AbstractGraph(int length) public AbstractGraph() public int vertexCount() public String toString() public T getVertex(int i) public void setVertex(int i, T x) }
i 1 i i 1 i i 1 i
《数据结构(Java版)(第4版)》第7章 6
n
n
3. 子图
《数据结构(Java版)(第4版)》第7章 7
4. 路径
5. 连通性
《数据结构(Java版)(第4版)》第7章 8
习题7-4
1. n(=4)个顶点具有最少边数的无向连通 图和有向强连通图是怎样的? //习题解答
7.1 图及其抽象数据类型 7.2 图的表示和实现 7.3 图的遍历 7.4 最小生成树 7.5 最短路径 目的:理解图结构。 要求:掌握图的存储结构和操作实现。
第 7章
图
重点:图的两种存储结构,遍历算法,最小生 成树,最短路径。 难点:图的存储和操作实现,最小生成树, 最短路径。
《数据结构(Java版)(第4版)》第7章 18
AbstractGraph<T>抽象图类 及其子类的层次关系
AbstractGraph<T> 抽象图类 继承 MatrixGraph<T> 邻接矩阵表示的图类 继承 AdjListGraph<T> 邻接表表示的图类
图7.13
《数据结构(Java版)(第4版)》第7章 19
3. 图带权值的边类
(1)带权值的边 图的边(起点序号,终点序号,权值) //矩阵非零元素三元组(5.2.2节) ,图带权值的边类 public class Triple implements Comparable<Triple> { int row, column, value; //行、列、元素