第六章学习了图
一、图的储存方式——邻接矩阵、邻接表、十字链表和邻接多重表
1、邻接矩阵是表示顶点之间相邻关系的矩阵
2、邻接表是图的一种链式存储结构,邻接表由表头结点表(数据域和链域)和边表(邻接点域、数据域和链域)
typedef struct ArcNode {// 边结点 int adjvex; struct ArcNode *nextarc; OtherInfo info; }ArcNode; typedef struct Vnode {// 顶点信息 VerTexType data; ArcNode *firstarc; }Vnode,AdjList[max]; typedef struct {// 邻接表 AdjList verices; int vexnum,arcnum; }ALGraph;
3、十字链表:有向图的邻接表和逆邻接表结合起来的一种链表
4、邻接多重表:无向图的另一种链式存储结构
二、图的遍历——深度优先和广度优先
1、深度优先(DFS)类似于树的先序遍历
邻接矩阵的深度优先
void DFS_AM(AMGraph G,int v) { //图G为邻接矩阵类型,从第v个顶点出发深度优先搜索遍历图G cout<<v;visited[v]=true; //访问第v个顶点,并置访问标志数组相应分址值为true for(w=O;w<G.vexnum;w++) //依次检查邻接矩阵 v所在的行 if((G.arcs[v] [w] !=O}&&(!visited[w]}} DFS(G,w}; //G.arcs[v] [w] ! =0 表示w是v的邻接点, 如果w未访问, 则递归调用DFS }
邻接链表的深度优先
void DFS_AL (ALGraph G,int v) {//图G为邻接表类型, 从第v个顶点出发深度优先搜索遍历图G cout<<v;visited[v]=true; //访问第v个顶点,并置访问标志数组相应分量值为true p=G.vertices[v] .firstarc; //p指向v的边链表的第一个边结点 while(p!=NULL) //边结点非空 { w=p->adjvex;//表示w是v的邻接点 if(!visited[w]) DFS(G,w); //如果w未访问, 则递归调用DFS p=p->nextarc; //p指向下一个边结点 } }
2、广度优先(BFS)——类似于树的按层次遍历,尽可能先对横向进行搜索
三、图的应用
主要的是:最小生成树(在一个连通网的所有生成树中,各边的代价和最小的那棵树成为最小生成树)
普里姆算法(Prjm算法):“加点法”(逐步增加U中的顶点)
克鲁斯卡尔算法(Kruskal算法):“加边法”(逐步增加生成树的边)
** 要求能够看懂代码
还有 最短路径--从源点到其余各顶点的最短路径
迪杰斯特拉算法(按照路径长短递增的次序产生最短路径)
四、总结
虽然这一章的内容比较少,知识点也是不怎么多,大部分也容易理解,但是实际上要实现代码的话还是很难的。对于图,包括它的存储,遍历,应用,在代码方面还是比前面学的树、线性表更为复杂。在图中任意两个结点的关系都是有可能相关的,两个结点之间的边有可能是空,有可能是有向、无向,图又能根据边或弧的多少分为稀疏图和稠密图。
这几次上课都有好好地总结笔记,看代码,希望自己下一阶段也能保持这种认真的态度,加油!!!