文章目录
06 图
6.1 相关定义和术语
-
有向图
-
无向图
-
子图
-
…
6.2 图的存储结构
6.2.1 邻接矩阵
(1)用 n 阶方阵表示,当两个顶点有连接时,则相应位置元素置为 1。
#define Max_Vertex_Num 20 // 图中最大顶点数
typedef struct ArcCell
{
int adj; // 对无权图,用0、1表示是否相邻;对带权图,则为权值
InfoType *info; // 该弧相关信息指针(可无)
}ArcCell, AdjMatrix[Max_Vertex_Num][Max_Vertex_Num];
这里要注意,邻接矩阵中的元素是一个结构体,取元素时需多一步。
(2)表示图时,用一个一维数组表示各顶点的值,用邻接矩阵表示弧
typedef struct
{
VertexType vexs[Max_Vertex_Num]; // 存储顶点值
AdjMatrix arcs; // 邻接矩阵
int vexnum, arcnum; // 存储顶点和弧的数目
}MGraph;
(3)无向图的邻接矩阵对阵,可压缩存储;有向图的邻接矩阵不一定对称(因为它可能是单向的)。
6.2.2 邻接表
弧结点
typedef struct Arcnode
{
int adjvex;
struct Arcnode *nextarc;
}ArcNode;
顶点结点
typedef struct Vnode
{
VertexType data;
ArcNode *firstarc;
}VNode, AdjList[Max_Vertex_Num];
图的定义
typedef struct
{
AdjList vertices;
int vexnum, arcnum; // 顶点和弧的数目
}ALGraph;
6.3 图的遍历
6.3.1 深度优先遍历(DFS)
一条路走到底,走不动时,逐步返回,再进行遍历。
递归算法实现
void DFS(ALGraph G, int v)
{
ArcNode *w;
int i;
printf("%d/t", v);
visited[i]=1;
w = G.vertices[v].firstarc;
while(w)
{
i = w->adjvex;
if(visited[i]==0)
DFS(G, i);
else w = w->nextarc;
}
}
int visited[MAX]; // 初始值都置零
void DFSTraverse(ALGraph G)
{
int i;
for (int i=0; i<G.vexnum; i++)
if(visited[i]==0)
DFS(G, i);
}
6.3.2 广度优先遍历(BFS)
类似树的层次遍历。