当前位置:文档之家› 图及有向图的应用

图及有向图的应用


单源最短路径问题是:给定带权有向图G=(V, E)和源点s∈V,找出从源点s到V 中其他各顶点的最短路径
迪杰斯特拉(Dijkstra)算法求单源最短路径
Dijkstra算法如下所示:
Dijkstra(G,D,s)
{
//用Dijkstra算法求有向网G的源点s到各顶点的最短路径长度
//以下是初始化操作
S={s};D[s]=0;
//设置初始的红点集及最短距离
for( all i∈ V-S )do
//对蓝点集中每个顶点i
D[i]=G[s][i];
//设置i初始的估计距离为w<s,i>
//以下是扩充红点集
for(i=0;i<n-1;i++)do
{
//最多扩充n-1个蓝点到红点集
D[k]=min{D[i];all i V-S};//在当前蓝点集中选估计距离最小的顶点k
基本术语:
1. 路径(Path) 在无向图G中,如果存在一个顶点序列vp, vi1, vi2, …, vim, vq,使得(vp, vi1),(vi1, vi2),…,(vim, vq)都属于E(G),则称顶点vp到vq存在一条路径(Path)
2. 简单路径 如果一条路径上除vp和vq外,其余顶点均不相同,则称此路径为一条简单路
径(这里vp和vq可以相同也可以不同)
3. 简单回路 起点和终点都相同的简单路径称为简单回路(Cycle)。
4. 有根图和图的根 在一个有向图中,如果存在一个顶点v,从v可以到达图中 其他所有顶点,则称此有向图为有根图,其中v称作图的根。
5. 连通图和连通分量 在无向图中,如果从顶点V到顶点V′有路径,则称V和V′ 是连通的。如果对于图中的任意两个顶点Vi和Vj都是连通的,则称G为连通图
8. 哈密顿图 若图G中存在一条通过图中所有顶点一次且仅一次的回路, 则称此回路为图的哈密顿回路;具有哈密顿回路的图称为哈密顿图
4.2 图的存储结构
4.2.1 图的邻接矩阵表示法
1. 图的邻接矩阵表示法
在图的邻接矩阵表示法中,用一个顺序表来存储顶点信息,用邻接矩阵来表示顶点间的相邻关 系。
2. 邻接矩阵(Adacency Matrix)
设G=(V, E)是具有n个顶点的图,则G4的.2邻.2接邻矩接阵表是表一个示n法阶方阵:
Vi,Vj 是E(G)中的边 若(Vi,V j)或 Vi,Vj 不是E(G)中的边
4.2.2 邻接表表示法
图的邻接表表示法类似于树的孩子链表表示法
邻接表的类型定义如下:
#define MaxVerNum 100
//最大顶点数为100
typedef struct node
{
//边表结点
int adjvex;
//邻接点域
struct node *next;
//链域
//若要表示边上的权,则应增加一个数据域
}EdgeNode;
typedef struct vnode
6. 强连通图和强连通分量 在有向图G中,若对于V(G)中任意两个不同 的顶点vi和vj,都存在从vi到vj以及从vj到vi的路径,则称G是强连通图。 有向图的极大强连通子图称为G的强连通分量。
7. 欧拉图 如果图中存在一条通过图中每条边一次且仅一次的回路,则 称此回路为欧拉回路,具有欧拉回路的图称为欧拉图
: 搜索过程
(a)无向图 G
(b)G 的深度优先搜索过程
4.3.2 广度优先搜索
特点:尽可能优先对横向搜索 基本思想是:从图中某个顶点v1出发,访问了v1之后依次访问v1的所有邻接点;然
后分别从这些邻接点出发按深度优先搜索遍历图的其他顶点,直至所有顶点都被 访问到
: 广度优先搜索的过程
4.4 单源最短路径问题
{
//顶点表结点
VertexType vertex;
//顶点域
EdgeNode *firstedge;
//边表头指针
}VertexNode;
typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型
typedef struct
{
AdjList adjlist;
//给二维数组d赋初值,等于邻接矩阵G for(i=0;i<n;i++)
for(j=0;j<n;j++) d[i][j]=G[i][j];
D[j]=D[k]+G[k][j];
}
}
4.5 顶点对之间最短路径
为了求出每一对顶点之间的最短路径,可以应用dijkstra算法,分别以每 个顶点为源点,求出从源点到各个顶点最短路径,除此之外,还可以应 用另一种算法,称为floyd算法
floyd算法的具体过程如下 : void Floeyd(adjmatrix G,adjmatrix d,int n) //利用弗洛伊德算法求图GA每对顶点间的最短长度,对应存于二维数组A中 { int i,j,k;
4.1 基本定义与术语
基本定义:
图的二元组定义:图G由两个集合V和E组成,记为: G=(V, E)
其中:V是顶点的有穷非空集合,E是V中顶点偶对(称为边)的有穷集 有向图还是无向图,顶点数n、边数e和度数之间有如下关系:
1 n
e 2 i1 D(vi )
其中:n为图中的顶点数,e为图中的边数,D(Vi)为图中的第i顶点的度数
if(D[k]==∞)
return; 路径不存在
//蓝点集中所有蓝点的估计距离均为∞时,表示这些顶点的最短
S=S∪{k};
//将蓝点k涂红后扩充到红点集
for( all j∈V-S )do
//调整剩余蓝点的估计距离
if(D[j]>D[k]+G[k][j])
//新红点k使原D[j]值变小时,用新路径的长度修改D[j],使j离s更近
//邻接表
int n,e; 图中当前顶点数和边数
}ALGraph; AdjList类型
//对于简单的应用,无须定义此类型,可直接使用
4.3 图的遍历
图的遍历基本方法有两种:深度优先搜索和广度优先搜索,这两种
方法都适用于有向图和无向图的遍历
4.3.1 深度优先搜索
特点:尽可能先对纵深方向进行搜索。 基本思想是:以图中某个顶点v1为出发点,先访问v1,然后选一个v1的邻 接点v2,以v2为新的出发点继续进行深度优先搜索,直至图中所有顶点都被访 问过。
相关主题