(一)基本概念
1.无向图:(vi,vj)
2.有向图:
3.无向完全图:在无相图中,如果任意两个顶点之间都存在边,则称为无向完全图
4.有向完全图:在有相图中,如果任意两个顶点之间都存在方向互为相反的边,则称为有向完全图
5.子图
6.网:带权的图称为网
7.连通图:任意两个顶点都是连通的无向图称为连通图
8.强连通图:任意两个顶点都是连通的有向图称为强连通图
9.连通分量:无向图中的极大连通子图称为连通分量
10.强连通分量:有向图中的极大强连通子图称为强连通分量
11.生成树:连通图的一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边
12.有向树:如果一个有向图恰有一个顶点的入度为0,其余顶点的入度为1,则是一棵有向树
13.生成森林:一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧
(二)存储结构
1.邻接矩阵
(1)用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或者弧的信息
(2)邻接矩阵
2.邻接表
(1)当顶点多边数少的情况下,用二维数组来存储邻接矩阵浪费内存,因此用邻接表来存储
(2)用一个一维数组来存储顶点,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储
(3)举例:
3.十字链表
(1)对于有向图来说,邻接表只能解决出度问题,逆邻接表只能解决入度问题,将两者结合起来就是十字链表
(2)十字链表其实是对邻接表的一个重新定义:
顶点表的结点结构如下:
边表的结点结构如下:
(3)举例:
4.邻接多重表
(1)对于无向图来说,邻接表关注的重点是顶点,并不关注边
(2)邻接多重表对边表结点重新进行定义:
(3)举例:
5.边集数组
(1)边集数组是由两个一维数组构成,一个存储顶点的信息,一个存储边的信息
(2)举例:
(三)图的遍历
1.深度优先遍历(depth first search,DFS)
思想其实就是对一个图转成一棵树之后进行前序遍历
2.广度优先遍历(breadth first search,BFS)
思想其实就是对一个图位置调整后进行层序遍历(调整的依据是先确定一个顶点,然后依次找出与上一层顶点有连接的顶点作为下一层顶点)
(四)最小生成树算法
我们把构造连通网的最小代价生成树称为最小生成树
1.普里姆算法(prim)——不断加入新的结点
(1)对于连通网N = (V,{E}),先随意确定一个顶点u0,U = {u0},TE = {}是N上最小生成树的边的集合
(2)在所有属于E的边(u,v)中(其中u属于U,v属于V-U),找出一条代价最小的边(u0,v0),加入到集合TE,同时将v0加入到U中
(3)重复以上步骤,直至U = V
2.克鲁斯卡尔算法(kruskal)——不断加入新的边
(1)对于连通网N = (V,{E}),初始的最小生成树状态是T = {V,{}}表示只有n个顶点而无边的非连通图,每个顶点自成一个连通分量
(2)在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将该边加入到T中,否则舍去
(3)重复步骤(2)直到T中所有顶点落在同一连通分量上为止
(五)最短路径算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上第一个顶点是源点,最后一个顶点是终点
1.迪杰斯特拉算法(dijkstra)
(1)算法思想:设G=(V,E)是一个带权图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中;在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度;此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度;
(2)算法步骤:
1)初始时,S只包含源点,即S={v},v的距离为0;U包含除v外的其他顶点,若v与U中顶点u有边,则正常有权值,若u不是v的出边邻接点,则 权值为∞
2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)
3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值
4)重复步骤b和c直到所有顶点都包含在S中
(3)举例:
(六)关键路径算法
1.AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网(activity on vertex network)
2.拓扑序列:设G(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,。。。vn满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之前,则我们称这样的顶点序列为一个拓扑序列
3.拓扑排序:对一个有向图构造拓扑序列的过程
4.拓扑排序算法:从AOV网中选择一个入度为0的顶点输出,然后删除此顶点,并删除以此顶点为尾的弧,继续重复此步骤,直到输出全部顶点;
5.AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,我们称之为AOE网(activity on edge network)
6.关键路径:从源点到汇点具有最大长度的路径叫关键路径
7.关键路径算法:首先根据是事件的最早发生时间跟最晚发生时间计算出活动的最早开工时间跟最晚开工时间,如活动的最早开工时间等于最晚开工时间,那么该活动为关键活动;