一、基本概念性质
1.图由边和点组成,它是一个非空的集合
2.若图中所有的顶点对<x,y>是有序的,则称为有向图。在有向图中<x,y>和<y,x>是不同的两条边
3.如果图中所有的顶点对(x,y)是无序的,则称为无向图。
4.完全图:在由n个顶点组成的无向图,
若任意两个顶点之间都存在边,有n(n-1)/2条边,则称为无向完全图。
若任意两个顶点之间都存在方向相反的两条弧,有n(n-1)条边,则称为有向完全图
5.权重:图中边具有与之相关的数值,称为权重。 权重可表示从一个顶点到另一个顶点的距离、花费的代价、所需的时间或次数等
6.网络:带权图也叫网络
7.在无向图中:
(1)连通:在无向图中,若从顶点v到顶点w有路径存在,则称v和w是连通的
(2)连通图:若图中任意两个顶点都是连通的,则称图为连通图。 若一个图有n个顶点,且边数<n-1,则必为非连通图
(3)极大练通子图是无向图的连通分量,极大要求连通子图包含其所有边
(4)极小连通子图既要保持图连通又要使得边数最少的子树
8.在有向图中:
(1)强连通:若从顶点v到顶点w 和从顶点w到顶点v之间都有路径,则称这两个顶点是强连通的
(2)强连通图:若图中任何一对顶点都是强连通的,则称此图为强连通图
(3)强连通分量:有向图中的极大强连通子图称为有向图的强连通分量
9.在无向图中,若有n个顶点,e条边的无向图 ,则总度数=2e
在有向图中,全部顶点的入度和=出度和=边数
10.若一个图有n个顶点,并且有大于n-1条边,则此图必有环
11.一个顶点的入度为0,其余顶点的入度均为1的有向图,称为有向树
二、图的存储
1.邻接矩阵存储指:用一个一维数组存储图中顶点的信息,用一个二维数组中边的信息,存储顶点之间邻接关系的二维数组称为邻接矩阵
A[i][j]=1表示顶点i与顶点j邻接,即i与j之间存在边或弧
A[i][j]=0表示顶点i与顶点j不邻接,(0<=i,j<=n-1)
对于无向图,邻接矩阵必对称,矩阵中1的个数为 图中总边数的2倍,
矩阵中第i行或第i列的元素之和即为顶点i的度
对于有向图,矩阵中1的个数为图的边数,
矩阵中第i行的元素之和即为顶点i的出度,第j列的元素之和即为顶点j的出度
对于带权图:若顶点vi 和vj之间有边相连,则邻接矩阵中对应项存放着该边对应的权值,若顶点Vi和Vj不相连,则通∞来表示这两个顶点之间不存在边
#define MaxVertexNum 100 //顶点数目的最大值
typedef char VertexType; //顶点的数据类型
typedef int EdgeType; //带权图中边上权值的数据类型
typedef struct{
VertexType Vex[MaxVertexNum]; //顶点表
EdgeType Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵,边表
int vexnum,arcnum; //图的当前顶点数和弧数
}MGraph; //图的当前顶点数和弧数
2.邻接表
它是图的一种链式存储结构。邻接表就是对图中每个顶点的i建立一个单链表,每个单链表的第一个结点存放有关顶点的信息,把这一结点看作链表的表头,其余结点存放有关边的信息。
因此邻接表由单链表的表头形成的顶点表和单链表其余结点的边表两部分组成。
一般顶点表存放顶点信息和指向第一个边结点指针,边表结点存放与当前顶点相邻顶点的序号和指向下一个边结点的指针
#define MaxVertexNum 100
typedef struct ArcNode{ //边表结点
int adjvex;
struct ArcNode *next;
//InfoType info;
}ArcNode
typedef struct VNode{ //顶点表结点
VertexType data;
ArcNode *first;
}VNode,AdjList[MaxVertexNum];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;