数据结构之图
有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)
核心算法思想
图是由顶点集合以及顶点间的关系集合组成的一种数据结构。Graph = (V,E) V是顶点的又穷非空集合;E是顶点之间关系的有穷集合,也叫边集合。
有向图:顶点对<x,y>是有序的;无向图:顶点对<x,y>是无序的。
图有两种遍历算法:
深度优先遍历(Depth_First_Search),也称为深度优先搜索,简称DFS。
广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS。
详细:遍历算法
算法实现不再举例,之后会出BFS和DFS的详细例题
实践出真知,代码案例
按照上面的有向图,编写一个程序,完成如下功能:
(1) 建立如下有向图G1的邻接矩阵输出,并由邻接矩阵产生邻接表输出之;
(2) 输出图G1从顶点0开始的深度优先遍历序列;
(3) 输出图G1从顶点0开始的广度优先遍历序列;
(4) 用普里姆算法输出从顶点0出发的最小生成树;
案例源码
#include <stdio.h>
#include <malloc.h>
typedef int InfoType;
#define MAXV 100 //最大顶点个数
#define INF 32767 //INF表示∞
//以下定义邻接矩阵类型
typedef struct
{
int no; //顶点编号
InfoType info; //顶点其他信息
} VertexType; //顶点类型
typedef struct //图的定义
{
int edges[MAXV][MAXV]; //邻接矩阵
int n, e; //顶点数,边数
VertexType vexs[MAXV]; //存放顶点信息
} MGraph; //图的邻接矩阵类型
//以下定义邻接表类型
typedef struct ANode //边的节点结构类型
{
int adjvex; //该边的终点位置
struct ANode *nextarc; //指向下一条边的指针
InfoType info; //该边的相关信息,这里用于存放权值
} ArcNode;
typedef int Vertex;
typedef struct Vnode //邻接表头节点的类型
{
Vertex data; //顶点信息
ArcNode *firstarc; //指向第一条边
} VNode;
typedef VNode AdjList[MAXV]; //AdjList是邻接表类型
typedef struct
{
AdjList adjlist; //邻接表
int n, e; //图中顶点数n和边数e
} ALGraph; //图的邻接表类型
//-------------------------------------
//--------带权图的算法-----------------
//-------------------------------------
void MatToList1(MGraph g, ALGraph *&G)
//将邻接矩阵g转换成邻接表G
{
int i, j;
ArcNode *p; //表结点结构类型
G = (ALGraph *)malloc(sizeof(ALGraph));
for (i = 0; i<g.n; i++) //给邻接表中所有头节点的指针域置初值
G->adjlist[i].firstarc = NULL;
for (i = 0; i<g.n; i++) //检查邻接矩阵中每个元素
for (j = g.n - 1; j >= 0; j--)
if (g