基本术语
------------------------------------------------------------------------------
- 弧头和弧尾
<x,y>表示从顶点到顶点y的一条弧,并称x为弧尾或起始点,称y为弧头或终端点
------------------------------------------------------------------------------
- 完全图,稀疏图与稠密图
对于无向图而言:
其边数e的取值范围是0~n(n-1)/2。有n(n-1)/2条边(图中每个顶点和其余n-1个顶点都有边相连)的无向图为无向完全图。
对于有向图而言:
其边数e的取值范围是0~n(n-1)。有n(n-1)条边(图中每个顶点和其余n-1个顶点都有边相连)的有向图为有向完全图。
对于有很少条边的图(e<logn)称为稀疏图,反之称为稠密图。
------------------------------------------------------------------------------
- 度,入度和出度
顶点v的度是指和v相关联边的数目,记作TD(v)。
入度和出度的概念是在有向图中存在。以顶点v为弧头的弧的数目为该顶点的入度,记作ID(v)。以顶点v为弧尾的弧的数目为该顶点的出度,记作OD(v)。则顶点v的度为TD(v)=ID(v)+OD(v)。
所有顶点的度数之和=2*e(一条边连接2个顶点)
------------------------------------------------------------------------------
- 路径和回路
从顶点v到v‘的路径是一个顶点序列vi0,vi1,vi2…vin,其中(vij-1,vij)属于E,1<=j<=n。
在一个路径中,若其第一个顶点和最后一个顶点是相同的即v=v’,则称该路径为一个环或回路。
若表示路径的顶点序列中的顶点各不相同,则称这样的路径为简单路径。
除了第一个顶点和最后一个顶点外,其各个顶点均不重复出现的回路为简单回路。
------------------------------------------------------------------------------
- 连通图
在无(有)向图的极大(强)连通子图,称连通分量(强联通图分量)。
一个连通图的一个极小连通子图是一个生成树:它含有图中全部顶点,但只有足以连通n个点的n-1条边。
-------------------------------------------------------------------------------
存储结构
- 邻接矩阵
一个用于存储顶点信息的一维数组,另一个是用于存储图中顶点之间关联关系的二维数组。
有向图的邻接矩阵不一定是对称的,无向图的邻接矩阵是对称矩阵。
对于无向图,其邻接矩阵第i行(或列)元素之和为第i个顶点的度。
对于有向图,其邻接矩阵第i行元素之和为第i个顶点的出度。
对于有向图,其邻接矩阵第i列元素之和为第i个顶点的入度。
邻接矩阵表示:
#define MAX_VERTEX_NUM 20 /*最多顶点个数*/
#define INFINITY 32768 /*表示极大值,即∞*/
typedef enum{DG, DN, UDG, UDN} GraphKind; /*图的种类:DG表示有向图, DN表示有向网, UDG表示无向图, UDN表示无向网*/
typedef char VertexData; /*假设顶点数据为字符型*/
typedef struct ArcNode
{
AdjType adj; /*对于无权图,用1或0表示是否相邻;对带权图,则为权值类型*/
OtherInfo info;
} ArcNode
typedef struct
{
VertexData vexs[MAX_VERTEX_NUM]; /*顶点向量*/
ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; /*结构体类型的二维数组*/
int vexnum,arcnum; /*图的顶点数和弧数*/
GraphKind kind; /*图的种类标志*/
} AdjMatrix; /*(Adjacency Matrix Graph)*/
采用邻接矩阵表示法创建有向图
int LocateVertex(AdjMatrix *G,VertexData v) /*求顶点位置函数*/
{
int j=Error,k;
for(k=0; k<G->vexnum; k++)
if(G->vexs[k]==v)
{
j=k;
break;
}
return(j);
}
int CreateDN(AdjMatrix *G) /*创建一个有向网*/
{
int i,j,k,weight;
VertexData v1,v2;
scanf("%d,%d",&G->arcnum,&G->vexnum); /*输入图的顶点数和弧数*/
for(i=0; i<G->vexnum; i++) /*初始化邻接矩阵*/
for(j=0; j<G->vexnum; j++)
G->arcs[i][j].adj=INFINITY;
for(i=0; i<G->vexnum; i++)
scanf("%c",&G->vexs[i]); /* 输入图的顶点*/
for(k=0; k<G->arcnum; k++)
{
scanf("%c,%c,%d",&v1,&v2,&weight);/*输入一条弧的两个顶点及权值*/
i=LocateVertex(G,v1);/*约定顶点的角标为它的编号*/
j=LocateVertex(G,v2);
G->arcs[i][j].adj=weight; /*建立弧*/
}
return(Ok);
}
------------------------------------------------------------------------------
- 邻接表表示:
表头结点表+边表组成。
表头结点表组成:数据域:存储顶点的名或其他有关信息。链域:指向链表中第一个结点。
边表组成:邻接点域:存放与顶点vi相邻接的顶点在图中的位置。链域:用于指向与顶点vi相关联的下一条边或弧的结点。数据域:用于存放与边或弧相关的信息。
对于无向图,顶点vi的度恰好就是第i个单链表上结点的个数。
对于有向图,顶点vi的出度恰好就是第i个单链表上结点的个数。
对于有向图,顶点vi的入度,必须遍历整个邻接表(或采用逆邻接表法)。
邻接表表示:
#define MAX_VERTEX_NUM 20
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcNode
{
int adjvex;/*该弧指向顶点的位置*/
struct ArcNode *nextarc;/*指向下一条弧的指针*/
OtherInfo info;/*与该弧相关的信息*/
}ArcNode;
typedef struct VertexNode
{
VertexData data;/*顶点数据*/
ArcNode *firstarc;/*指向该顶点第一条弧的指针*/
}
VertexNode;
typedef struct
{
VertexNode vertex[MAX_VERTEX_NUM];
int vexnum,arcnum;/*图的顶点数和弧数*/
GraphKind kind;/*图的种类标志*/
}AdjList;
下午推送的音乐很舒缓,太阳很暖,牛奶很可口。-2020.4.13