图
图的逻辑结构:
无向图:
每条边都没有方向,用(Vi,Vj)表示某条边
有向图:
每条边都有方向,用<Vi,Vj>表示A指向B的边
无向图某顶点的度:
与顶点连接的边数
有向图某顶点的度:
入度:流入该顶点的边数
出度:流出该顶点的边数
简单图:
不存在重复的边的图
无向完全图:
图中任意两顶点之间存在边,边的条数为n(n-1)/2,n为顶点数
有向完全图:
图中任意两顶点之间存在方向相反的两条边,边的条数为n(n-1),n为顶点数
带权图(网):
每条边都带有权值的图
子图:
图中任意两个顶点和连接这两个顶点的边的组合体
路径:
路径是一个顶点到另一个顶点序列,路径长度是路径上边的条数
环(回路):
从顶点x(x为图中任一顶点)经过某条路径回到顶点x
简单路径:
序列中顶点不重复出现的路径
简单环:
序列中顶点不重复出现的环
连通图:
无向图中,Vi到Vj有路径,则这两个顶点连通;若任意一对顶点连通,称为连通图
连通分量:
无向图中的极大连通子图
强连通图:
有向图中,Vi到Vj有路径,则这两个顶点连通;若任意的Vi到Vj有路径,称为强连通图
强连通分量:
有向图中的极大连通子图
图的存储结构:
邻接矩阵的理解:
如由5个数字顶点所组成的有向不带权图,我们想要存储这个有向图的顶点信息和顶点之间关系的信息.
首先顶点之间关系有:
0~(0,1,2,3,4)
1~(0,1,2,3,4)
2~(0,1,2,3,4)
3~(0,1,2,3,4)
4~(0,1,2,3,4)
也即顶点关系为25种
如果用一个二维数组表示就是这样:
0 1 2 3 4
0 x x x x x
1 x x x x x
2 x x x x x
3 x x x x x
4 x x x x x
x=1表示<Vi,Vj>存在;x=0表示<Vi,Vj>不存在
将上述图改成有向带权图,如果用一个二维数组表示就是这样:
0 1 2 3 4
0 x x x x x
1 x x x x x
2 x x x x x
3 x x x x x
4 x x x x x
x=X(X∈N*)表示<Vi,Vj>边的权值数;x=∞表示<Vi,Vj>不存在
邻接矩阵:
邻接矩阵的结构体设计:
typedef struct
{
int no;//顶点的下标
}VertexType;
图的结构体设计:
typedef struct
{
//二维数组存放(不带权,有边:1,无边:2;带权,存放边的权值)
float edges[maxSize][maxSize];
int n,e;//存放顶点数和边数
VertexType vex[maxSize];//存放顶点信息(这里只存放了下标)
}MGraph;
邻接表:
边结点的结构体设计:
typedef struct ArcNode
{
int adjV;//邻接顶点
struct ArcNode* next;//指向下一个边结点的指针
}ArcNode;
图顶点的结构体设计:
typedef struct
{
int data;//顶点信息
ArcNode* first;//指向头一个边结点的指针
}VNode;
图的结构体设计
typedef struct
{
VNode adjList[maxSize];//存放结点信息
int n,e;//顶点和边的个数