7、图
7.1图的定义
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
无向边:若顶点vi到vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(vi,vj)来表示。如果图中任意两个顶点之间的边都是无向边,则称该图为无向图(Undirected graphs)
有向边:若从顶点vi到vj的边有方向,则称为弧(Arc)。用有序偶<vi,vj>来表示,vi称为弧尾(Tail),vj称为弧头(Head)。如果图中任意两个顶点之间的边都是有向边,则称该图为有向图(Directed graphs)
在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图
在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。含有n个顶点的无向完全图有n(n-1)/2条边
在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。含有n个顶点的无向完全图有n(n-1)条边
有很少条边或弧的图称为稀疏图,反之称为稠密图
与图的边或弧有关的数叫做权(Weight),带权的图通常称为网(NetWork)
假设有两个图G=(V,{E}),G’=(V’,{E’}),如果V‘⊆V,E’⊆E,则称G’为G的子图
图的顶点与边间关系
对于无向图G=(V,{E}),如果边(v,v’)∈E,则称顶点v和v‘互为邻接点(Adjacent),即v和v’相邻接。边(v,v’)依附(incident)于顶点v和v’,或者说(v,v’)与顶点v和v’相关联。顶点v的度(Degree)是和v相关联的边的数目,记为TD(v)。
对于有向图G=(V,{E}),如果弧<v,v’>∈E,则称顶点v邻接到顶点V’,顶点v’邻接自顶点v。弧<v,v’>和顶点v,v’相关联。以顶点v为头的弧的数目称为v的入度(InDegree),记为ID(v);以v为尾的弧的数目称为v的出度(OutDegree),记为OD(v);顶点v的度TD(v)=ID(v)+OD(v)。
路径的长度是路径上的边或弧的数目
第一个顶点到最后一个顶点相同的路径称为回路或环(Cycle)。序列中顶点不重复出现的路径称为简单路径。除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。
连通图相关术语
在无向图G中,如果从顶点v到顶点v’有路径,则称v和v‘是连通的。如果对于图中任意两个顶点vi,vj∈E,vi和vj都是连通的,则称G是连通图(Connected Graph)。
无向图中的极大连通子图称为连通分量,注意
- 要是子图
- 子图要是连通的
- 连通子图含有极大顶点数
- 具有极大顶点数的连通子图包含依附于这些顶点的所有边
在有向图G中,如果对于每一对vi,vj∈V、v1≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量。
7.2图的抽象数据类型
ADT 图(Graph)
Data
顶点的有穷非空集合和边的集合。
Operation
CreateGraph(*G,V,VR):按照顶点集V和边弧集VR的定义构造图G。
DestroyGraph(*G):图G存在则销毁。
LocateVex(G,u):若图G中存在顶点u,则返回图中的位置
GetVex(G,v):返回图G中项点v的值。
PutVex(G,v,value):将图G中顶点v赋值value。
FirstAdjVex(G,*v):返回顶点v的一个邻接顶点,若项点在G中无邻接顶点返回空。
NextAdjVex(G,v,*w):返回顶点v相对于顶点w的下一个邻接顶点,若w是v的最后
一个邻接点则返回“空”。
InsertVex(*G,v):在图G中增添新顶点V。
DeleteVex(*G,v):删除图G中顶点V及其相关的弧。
InsertArc(*G,v,w):在图G中增添弧<v,w>,若G是无向图,还需要增添对称弧<w,v>。
DeleteArc(*G,v,w):在图G中删除弧<v,w>,若G是无向图,则还删除对称孤
<w,v>。
DFSTraverse(G):对图G中进行深度优先遍历,在遍历过程对每个顶点调用。
HFSTraverse(G):对图G中进行广度优先遍历,在遍历过程对每个顶点调用。
endADT
7.3图的存储结构
邻接矩阵
图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
图的邻接矩阵存储结构代码
typedef char VertexType;/*顶点类型应由用户定义*/
typedef int EdgeType;/*边上的权值类型应由用户定义*/
#define MAXVEX 100/*最大顶点数,应由用户定义*/
#define INFINITY 65535/*用65535来代表00*/
typedef struct
{
VertexType vexs[MAXVEX];/*顶点表*/
EdgeType arc [MAXVEX] [MAXVEX]; /* 邻接矩阵,可看作边表 */
int numVertexes,numEdges;/*图中当前的顶点数和边数*/
}MGraph;
无向网图创建代码
//建立无向网图的邻接矩阵表示
void CreateMGraph(MGraph *G)
{
int i,j,k,w;
printf("输入顶点数和边数:\n");
scanf("%d,%d",&G->numVertexts,&G->numEdges);//输入顶点数和边数
for(i=0;i<G->numVertexts;i++) //输入顶点信息,建立顶点表
scanf(&G->vexs[i]);
for(i=0;i<G->numVertexts;i++)
for(j=0;j<</