数据结构与算法:图

本文介绍了图的定义,包括无向图与有向图,以及相关术语如顶点、边、度、邻接点。接着阐述了图的两种存储结构——邻接矩阵和邻接表,以及它们各自的优缺点。最后,概述了图的遍历方法(深度优先和广度优先)、生成树的概念及最小生成树的普里姆和克鲁斯卡尔算法,以及图的应用,如迪杰斯特拉算法、拓扑排序和关键路径等。
摘要由CSDN通过智能技术生成

一,图的定义

在图中的数据元素通常称为顶点,图(Graph)是由顶点集合(Vertex)及顶点之间的关系集合(Edge)组成的一种数据结构。记为G=(V,E)。


我们把左图称为无向图G1。
G1=(V1,E1)
其中V1={A, B, C, D, E}
E1={(A, D),(B, C),(B, D),(B, E),(D, E)}

右图称为有向图G2。
G2=(V2, E2)
其中V2={A, B, C, D}
E2={<A, B>, <A, C>, <D, A>, <D, B>}
关于图的基本术语:
在图中,根据顶点之间的关系是否有方向性可将图分为有向图和无向图。
无向图:对于无向图,顶点的关系为无向边,用圆括号表示,如(x,y)。
有向图:对于有向图来说,顶点间的关系称为有向边,用尖括号表示,如<x,y>。
由于无向图中边的取值范围:0≤e≤n(n-1)/2。
有向图中弧的取值范围:0≤e≤n(n-1)。
其中n表示图中的顶点数目,e表示边数。
完全图:有 n(n-1)/2 条边的无向图(即: 每两个顶点之间都存在着一条边)称为完全图
有 n (n - 1) 条弧的有向图 (即:每两个顶点之间都存在着方向相反的两条弧)称为有向完全图。
稀疏图:含有很少条边或弧的图。
稠密图:含有很多条边或弧的接近完全图的图。
:与图的边或弧相关的数,权值可以是距离,时间,价格等。
: 带权的图。
在这里插入图片描述

子图:若有两个图 G1和G2,其中G1=(V1,E1) ,G2=(V2,E2) ,且满足如下条件:V2 属于 V1,E2 属于 E1
即V2 为V1 的子集,E2 为E1 的子集,则称图 G2为图G1 的子图。
在这里插入图片描述
如图所示,后面的两个图就是前面图的子图。
邻接点和度
对于无向图,假若顶点v 和顶点w 之间存在一条边,则称顶点v 和w 互为邻接点。和顶点v 关联的边的数目定义为v的度。记为ID(V)。
对于有向图,由于弧有方向性,则有入度和出度之分。顶点的出度是以顶点v 为弧尾的弧的数目,记为OD(V)。顶点的入度是以顶点v为弧头的弧的数目,记为ID(V)。
路径长度:图中两个顶点之间的路径为两个顶点之间的顶点序列,路径上所含边的数目。
简单路径:若序列中第一个顶点和最后一个顶点相同的路径称为回路或环,序列中顶点不重复出现的路径。
简单回路:若序列中除第一个顶点和最后一个顶点相同外,其余顶点不重复的回路。
连通:从顶点 v 到 v´ 有路径,则说 v 和 v´ 是连通的。
连通图:图中任意两个顶点都是连通的。
非连通图:图中并非任意两个顶点都是连通的。
连通分量:无向图的极大连通子图。
强连通图:有向图的任意两个顶点之间都存在一条有向路径。
强连通分量:有向图中极大的强连通子图

二,图的存储结构

1.邻接矩阵
用两个数组来表示图,一个一维数组,存储图中顶点的信息,一个数二维数组,即矩阵,存储顶点之间相邻的信息,也就是边(或弧)的信息。
设图G=(V,E),有n 个顶点,则其所对应的邻接矩阵A 是按如下定义的一个 二维数组: 在这里插入图片描述
对于无向图:
无向图的邻接矩阵的特点?
一定是对称矩阵。
如何求顶点i的度?
邻接矩阵的第i行(或第i列)非零元素的个数。
如何求顶点 i 的所有邻接点?
将数组中第 i 行元素扫描一遍,若a[i][j]为1,则顶点 j 为顶点 i 的邻接点。
对于有向图:
如何求顶点 i 的出度、入度?
邻接矩阵的第 i 行元素之和,第i列元素之和。

邻接矩阵的优点:很容易确定图中任意两个顶点之间是否有边相连(邻接)
不足:但要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。
邻接矩阵存储空间为 O(n^2),所以适用于稠密图。

public class Graph<T>
{
   
	protected final int MAXSIZE=10;//邻接矩阵可以表示的最大顶点数 
	protected final int MAX=999; //在网中,表示没有联系,(权值无限大)
	protected T[]  V;//顶点信息
	protected int[][] arcs;//邻接矩阵
	protected int e;//边数
	protected int n;//顶点数	
	public Graph( )  {
     
	   V = (T[]) new Object [MAXSIZE];
	   arcs = new int [MAXSIZE] [MAXSIZE];
	}
	public void CreateAdj( ){
    
	//创建无向图的邻接矩阵   算法6-3
	}	
	//查找顶点,存在返回索引,不存在则返回-1.--算法6-1
	public int LocateVex(T v){
     return -1;	}
	//显示邻接矩阵--算法6-2
	public	void DisplayAdjMatrix(){
   	}
}
//算法6-1
public int LocateVex(T v){
    
	int i;
	for(i=0;i<n;i++)if(V[i]==v)return i;
	return -1; 
}
//算法6-2
public	void DisplayAdjMatrix( ){
    
	int i,j;
	System.out.println("图的邻接矩阵表示:");	for(i=0;i<n;i++){
   
		for(j=0;j<n;j++){
   
			System.out.print(" "+arcs
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值