概述
图(Graph)是一种比线性表和树更为复杂的数据结构。
线性结构:是研究数据元素之间的一对一关系。在这种结构中,除第一个和最后一个元素外,任何一个元素都有唯一的一个直接前驱和直接后继。
树结构:是研究数据元素之间的一对多的关系。在这种结构中,每个元素对下(层)可以有0个或多个元素相联系,对上(层)只有唯一的一个元素相关,数据元素之间有明显的层次关系。
图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。
图的基本概念
图的定义和术语
一个图(G)定义为一个偶对(V,E),记为G=(V,E)。其中:V是顶点(Vertex)的非空有限集合,记为V(G);E是无序集V&V的一个子集,记为E(G),其元素是图的弧(Arc)。
将顶点集合为空的图称为空图。其形式化定义为:
G=(V,E)
V={v|vÎdataobject}
E={<v,w>|v,wÎV∧p(v,w)}
P(v,w)表示从顶点v到顶点w有一条直接通路。
弧(Arc):表示两个顶点v和w之间存在一个关系,用顶点偶对<v,w>表示。通常根据图的顶点偶对将图分为有向图和无向图。
有向图(Digraph):若图G的关系集合E(G)中,顶点偶对<v,w>的v和w之间是有序的,称图G是有向图。
在有向图中,若<v,w>ÎE(G),表示从顶点v到顶点w有一条弧。其中:v称为弧尾(tail)或始点(initialnode),w称为弧头(head)或终点(terminalnode)。
无向图(Undigraph):若图G的关系集合E(G)中,顶点偶对<v,w>的v和w之间是无序的,称图G是无向图。
在无向图中,若"<v,w>ÎE(G),有<w,v>ÎE(G),即E(G)是对称,则用无序对(v,w)表示v和w之间的一条边(Edge),因此(v,w)和(w,v)代表的是同一条边。
例1:设有有向图G1和无向图G2,形式化定义分别是:
G1=(V1,E1)
V1={a,b,c,d,e}
E1={<a,b>,<a,c>,<a,e>,<c,d>,<c,e>,<d,a>,<d,b>,<e,d>}
G2=(V2,E2)
V2={a,b,c,d}
E2={(a,b),(a,c),(a,d),(b,d),(b,c),(c,d)}
它们所对应的图如图所示。
完全无向图:对于无向图,若图中顶点数为n,用e表示边的数目,则eÎ[0,n(n-1)/2]。具有n(n-1)/2条边的无向图称为完全无向图。完全无向图另外的定义是:
对于无向图G=(V,E),若"vi,vjÎV,当vi≠vj时,有(vi,vj)ÎE,即图中任意两个不同的顶点间都有一条无向边,这样的无向图称为完全无向图。
完全有向图:对于有向图,若图中顶点数为n,用e表示弧的数目,则eÎ[0,n(n-1)]。具有n(n-1)条边的有向图称为完全有向图.完全有向图另外的定义是:
对于有向图G=(V,E),若"vi,vjÎV,当vi≠vj时,有<vi,vj>ÎE∧<vj,vi>ÎE,即图中任意两个不同的顶点间都有一条弧,这样的有向图称为完全有向图。
有很少边或弧的图(e<n㏒n)的图称为稀疏图,反之称为稠密图。
权(Weight):与图的边和弧相关的数。权可以表示从一个顶点到另一个顶点的距离或耗费。
子图和生成子图:设有图G=(V,E)和G’=(V’,E’),若V’ÌV且E’ÌE,则称图G’是G的子图;若V’=V且E’ÌE,则称图G’是G的一个生成子图。
顶点的邻接(Adjacent):对于无向图G=(V,E),若边(v,w)ÎE,则称顶点v和w互为邻接点,即v和w相邻接。边(v,w)依附(incident)与顶点v和w。
对于有向图G=(V,E),若有向弧<v,w>ÎE,则称顶点v“邻接到”顶点w,顶点w“邻接自”顶点v,弧<v,w>与顶点v和w“相关联”。
顶点的度、入度、出度:对于无向图G=(V,E),"viÎV,图G中依附于vi的边的数目称为顶点vi的度(degree),记为TD(vi)。
显然,在无向图中,所有顶点度的和是图中边的2倍。即∑TD(vi)=2ei=1,2,…,n,e为图的边数。
对有向图G=(V,E),若"viÎV,图G中以vi作为起点的有向边(弧)的数目称为顶点vi的出度(Outdegree),记为OD(vi);以vi作为终点的有向边(弧)的数目称为顶点vi的入度(Indegree),记为ID(vi)。顶点vi的出度与入度之和称为vi的度,记为TD(vi)。即
TD(vi)=OD(vi)+ID(vi)
路径(Path)、路径长度、回路(Cycle):对无向图G=(V,E),若从顶点vi经过若干条边能到达vj,称顶点vi和vj是连通的,又称顶点vi到vj有路径。
对有向图G=(V,E),从顶点vi到vj有有向路径,指的是从顶点vi经过若干条有向边(弧)能到达vj。或路径是图G中连接两顶点之间所经过的顶点序列。即
Path=vi0vi1…vim,vijÎV且(vij-1,vij)ÎEj=1,2,…,m或
Path=vi0vi1…vim,vijÎV且<vij-1,vij>ÎEj=1,2,…,m
路径上边或有向边(弧)的数目称为该路径的长度。
在一条路径中,若没有重复相同的顶点,该路径称为简单路径;第一个顶点和最后一个顶点相同的路径称为回路(环);在一个回路中,若除第一个与最后一个顶点外,其余顶点不重复出现的回路称为简单回路(简单环)。
连通图、图的连通分量:对无向图G=(V,E),若"vi,vjÎV,vi和vj都是连通的,则称图G是连通图,否则称为非连通图。若G是非连通图,则极大的连通子图称为G的连通分量。
对有向图G=(V,E),若"vi,vjÎV,都有以vi为起点,vj为终点以及以vj为起点,vi为终点的有向路径,称图G是强连通图,否则称为非强连通图。若G是非强连通图,则极大的强连通子图称为G的强连通分量。
“极大”的含义:指的是对子图再增加图G中的其它顶点,子图就不再连通。
生成树、生成森林:一个连通图(无向图)的生成树是一个极小连通子图,它含有图中全部n个顶点和只有足以构成一棵树的n-1条边,称为图的生成树,如图所示。
关于无向图的生成树的几个结论:
◆一棵有n个顶点的生成树有且仅有n-1条边;
◆如果一个图有n个顶点和小于n-1条边,则是非连通图;
◆如果多于n-1条边,则一定有环;
◆有n-1条边的图不一定是生成树。
有向图的生成森林是这样一个子图,由若干棵有向树组成,含有图中全部顶点。
有向树是只有一个顶点的入度为0,其余顶点的入度均为1的有向图,如图7-3所示。
网:每个边(或弧)都附加一个权值的图,称为带权图。带权的连通图(包括弱连通的有向图)称为网或网络。网络是工程上常用的一个概念,用来表示一个工程或某种流程,如图7-4所示。
图的抽象数据类型定义
图是一种数据结构,加上一组基本操作就构成了图的抽象数据类型。图的抽象数据类型定义如下:
Graph{
数据对象V:具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR}
VR={<v,w>|<v,w>|v,wÎV∧p(v,w),<v,w>表示从v到w的弧,P(v,w)定义了弧<v,w>的信息}
基本操作P:
添加顶点
添加边
获得顶点的个数
获得边的条数
移除顶点
移除边
……
}
图的接口Graph
package datastructure.graph;
/**
* 图的接口
* @author luoweifu
*
*/
public interface Graph {
/**
* 添加顶点
* @param v
*/
public void addVex(Object v);
/**
* 添加边
* @param v1 第一个顶点
* @param v2 第二个顶点
* @param weight 权值
*/
public void addEdge(Object v1, Object v2, double weight);
/**
* 添加边
* @param v1 第一个顶点
* @param v2 第二个顶点
* @param info 边信息
* @param weight 权值
*/
public void addEdge(Object v1, Object v2, Object info, double weight);
/**
* 置空图
*/
public void clear();
/**
* 获得顶点v的第一个邻接结点
* @param v 顶点
* @return 顶点v的第一个邻接结点
*/
public Object getFirstVertex(Object v);
/**
* 在图G中寻找v1结点的邻接结点v2的下一个邻接结点
* @param v1 顶点
* @param v2 v1的一个邻接结点
* @return 邻接v1的在v2后的一个结点
*/
public Object getNextVertex(Object v1, Object v2);
/**
* 获得顶点的个数
* @return
*/
public int getVertexSize();
/**
*获得边的条数
* @return
*/
public int getEdgeSize();
/**
* 移除顶点
* @param v 顶点
*/
public void removeVex(Object v);
/**
* 移除边
* @param v1 顶点1
* @param v2 顶点2
*/
public void removeEdge(Object v1, Object v2);
/**
* 深度优先遍历
* @param o 遍历的初始顶点
* @return 遍历的结果
*/
public String dfs(Object o);
/**
* 深度优先遍历
* @param o 遍历的初始顶点
* @return 遍历的结果
*/
public String bfs(Object o);
/**
* 打印图的各顶点
* @return
*/
public String printGraph();
}
边的接口Edge
package datastructure.graph;
public abstract class Edge implements Comparable{
protected double weight;
protected Object info;
/**
* 构造函数
*/
public Edge() {
this.weight = 0;
}
/**
* 构造函数
* @param weight 权值
*/
public Edge(double weight) {
this.weight = weight;
}
public Edge(Object info, double weight) {
this.weight = weight;
this.info = info;
}
/**
* 获取权值
* @return 权值
*/
public double getWeight() {
return weight;
}
/**
* 设置权值
* @param weight 权值
*/
public void setWeight(double weight) {
this.weight = weight;
}
/**
* 获取边的信息
* @return 边的信息
*/
public Object getInfo() {
return info;
}
/**
* 设置边的信息
* @param info 边的信息
*/
public void setInfo(Object info) {
this.info = info;
}
/**
* 获取边的第一个顶点
* @return 第一个顶点
*/
public abstract Object getFirstVertex();
/**
* 获取边的第二个顶点
* @return 第二个顶点
*/
public abstract Object getSecondVertex();
}
分享到:
相关推荐
重新整理汇编—————寄存器的基本概念[二] 本文档对寄存器的基本概念进行了详细的介绍,涵盖了寄存器的定义、分类、结构、工作原理等方面的知识点。 1. 寄存器的定义:寄存器是一种小型的高速存储器,位于 ...
例如在饱和溶液和不饱和溶液的概念学习中,学生需要掌握饱和溶液和不饱和溶液的定义、特点、应用等核心要素,并将其应用于实际问题中,例如解决生活中的实际问题。 4. 迁移与应用——化学概念的灵活迁移 迁移与...
图的基本概念: 引入 定义 相关术语: 有向图 无向图 完全图 稀疏图 稠密图 权 网 邻接 关联(依附) 顶点的度 有向树 路径 路径长度 回路(环) 简单路径 简单回路(简单环) 连通图 强连通图 子图 连通分量 强连通...
本篇文章将深入探讨"android理论学习——基本概念"中的三个关键要素:Manifest、Content Providers以及Intent和Intent-filter。这些元素构成了Android应用程序的基础架构,使得开发者能够构建功能丰富的移动应用。 ...
《MBA决策分析教材——多目标决策的基本概念》 多目标决策是企业管理中至关重要的一环,尤其在复杂的决策环境中,往往需要同时考虑多个相互冲突或不可公度的目标。本章主要介绍了多目标决策的基本概念,包括其特点...
《信息新概念——信息与信息技术》这篇文档主要探讨了信息的基本概念、信息技术的含义以及它们在现代社会中的重要性。教学目标旨在让学生理解信息的内涵、特征,了解信息技术及其与计算机的关系,同时关注信息技术的...
综上所述,文档《N2 Ch1——1.2 概率的定义及性质.pdf》系统地介绍了概率论的基础知识,包括概率的频率定义、统计概率定义以及公理化定义,为后续学习概率论的乘法公式、全概率公式和事件的独立性等内容奠定了基础。...
《统一建模语言(UML)参考手册——基本概念》是一份详尽的指南,旨在介绍UML(Unified Modeling Language)的基础知识,适用于软件工程师、架构师、分析师以及其他对软件开发和系统设计感兴趣的专业人士。UML是一种...
首先,我们需要了解图的基本概念。图分为有向图和无向图。在有向图中,每条边都有明确的方向,从一个顶点指向另一个顶点。例如,可以用来表示从一个城市到另一个城市的航班路径。而在无向图中,边没有方向,两个顶点...
总的来说,本节课通过实践操作,使学生掌握LOGO语言中带参数过程的基本概念和应用,激发他们对编程的兴趣,培养解决问题的能力,为后续更复杂的编程学习打下基础。通过这样的教学方式,学生不仅能学会画图,还能体会...
本文将介绍 C++ 中的类和对象基本概念,包括类的定义、类的特点、对象的概念、类的实现、权限限定词的作用、创建对象的方法等。 类的概念: 在 C++ 中,类是一系列事物的抽象,万事万物都可以是类。类包括两个部分...
《PC技术内幕系列专题(七)——CPU技术内幕之基本计算概念篇》深入解析了CPU这一复杂的计算核心,强调了理解和分析CPU时不应局限于物理层面和最新技术,而是要重视基本的计算概念。文章旨在为非计算机硬件专业的...
在高中数学的学习中,第六章三角函数是至关重要的一个部分,...这个压缩包内的"高一数学基本概念——第6章三角函数.pdf"文件,应该包含详细的理论解释、例题解析和练习题,帮助学生全面理解和掌握这一重要章节的内容。
此外,实验涉及到关系数据库的基本概念,如实体完整性(主键不允许为空值)、参照完整性(外键关联主键确保数据一致性)和用户定义完整性(自定义的约束条件)。 在创建各关系表时,例如图书分类、书目、图书、读者...
本文将对 Java 图形编程中的基本概念和技术进行总结,主要涵盖 Graphics、paint()、repaint() 等关键概念。 Graphics 概念 Graphics 是 Java 中的一个抽象类,提供了基本的绘图方法,如画直线、曲线等。 Graphics ...
### 数据结构C++ 线性表——顺序表和单链表基本操作 #### 一、概述 在《数据结构C++ 线性表——顺序表和单链表基本操作(含代码和注释).docx》文档中,作者详细介绍了如何在C++中实现顺序表和单链表的基本操作,并...
通过对UML基本概念的学习,不仅可以提高软件开发的效率和质量,还能促进团队成员之间的有效沟通,确保项目顺利进行。无论是初学者还是经验丰富的开发者,深入理解UML的基本概念都是提升软件工程技能的关键步骤。
飞思卡尔单片机教程——概念介绍非常详细 本教程主要介绍了飞思卡尔单片机的概念和基本结构,着重于ATD模块的控制寄存器和A/D转换的实现机制。 一、ATD模块控制寄存器 1. ATD0CTL2:A/D控制寄存器2 ASCIE:转换...
标题和描述中提到的《20172.1位置——上下前后.[定义].pdf》是一份关于小学数学教学的内容,主要围绕着“上下前后”的位置关系进行教学。这一单元的目标是让学生通过具体活动,理解和体验上下、前后的位置与顺序,...