图这章很快就学完了,学完发现印象最深刻的是邻接表和邻接矩阵还有深搜和广搜。
那接下来就重头捋捋我学习了什么。
一、图的术语
emm这些就不用细讲了,主要就是
1、生成树:极小连通子图,含有图中全部顶点,只有n-1条边。
2、极小生成树:权值最小的生成树。
二、构建图
1、基于邻接矩阵的存储:AMGraph
#define MVNum 100 //最大顶点数 typedef char VerTexType; //顶点的数据类型 typedef int ArcType; //边的权值类型 typedef struct { VerTexType vexs [MVNum]; //顶点表(一维数组) ArcType arcs [MVNum] [MUNum]; //邻接矩阵 int vexnum, arcnum; //顶点数及边数 } AMGraph;
(定义,建立,根据顶点名字查找其对应顶点表vexs的下标)
然后就是定义一个图 AMGraph g, 然后需要建立邻接矩阵,然后就要弄一个locate 函数在矩阵里找
缺点:稀疏图浪费空间。
2、基于邻接表的存储: ALGraph
typedef struct ArcNode // { int adjvex; //该边指向顶点的位置 struct ArcNode *nextarc; //下一条边的指针 quanzhi info; //边权值 } ArcNode; typedef struct VNode //顶点信息 { VerTexType data; ArcNode *fiestarc //第一条指该定点的边的指针 }VNode, AdjList [MVNum]; typedef struct { AdjList verices; int vexnum,arcnum; //顶点数 边数 }ALGraph;
跟邻接表类似,也是定义,建立,根据顶点名字查找顶点表
三、DFS & BFS
深度优先:找到一个顶点出发,访问v, 找出刚访问过的顶点的第一个未被访问的邻接点,访问该顶点,然后是以该顶点为新的,重复继续;
然后没有之后就返回;
void DFS(ALGraph G, int v) { ArcNode *p = new ArcNode; int w = 0; cout << G.vertices[v].data << endl; visited[v] = true; p = G.vertices[v].firstarc; while (p != NULL) { w = p->adjvex; if (visited[w] == false) { DFS(G, w); } p = p->nextarc; } }
广度优先搜索:利用队列
起始顶点先入队 对于每一个准备入队的顶点
1、先访问再入队 对出队元素x 的每个邻接点做判断,如果为访问,则访问后入队。
2、直接入队 对出队元素x 先判断是否访问,访问后,x 的邻接点入队。(在出队时判断,会导致队列里多了许多不需要的)
然后就还学了求最小生成树的普里姆算法和克鲁斯卡算法
普里姆算法从顶点入手 时间复杂度 n*n 适用稠密图
克鲁斯卡尔算法则从边入手 时间复杂度 eloge 稀疏图
主要步骤就是刷新,找到最小权值
迪杰斯特拉算法 求最短路径
方法其实差不多,就是刷新时通过比较,然后找出最短的权值之和。
本周对于数据结构学习的也不是很周到,只是粗略地了解学习地内容,并没有深入研究,希望可以逐步培养起对计算机的兴趣,
因为没有兴趣,学习起来,很费劲,加油。