数据结构第六章小结
一、知识点小结
第六章学习了图
1)度:(无向图)与特定顶点相连接的边数。
(有向图)度=入度+出度,入度是以顶点v为头的弧的数目,出度是以顶点 v 为尾的弧的数目。
2)连通分量:极大连通子图的数量。对于连通图,其连通分量是它本身。
3)图的储存结果有两种:邻接矩阵和邻接表。
邻接矩阵:易于判断两点是否有边和找到邻接点,但比较浪费空间。
邻接表:空间利用高且便于删除增加结点,但是对于有向图顶点的度的计算很麻烦(可以采用逆邻接表作辅助计算)。
4)图的遍历算法:DFS和BFS。
DFS(深度)可以说是逐个逐个顶点的访问,若当前访问的顶点被访问过则退回上一层访问上一层别的未被访问的点,直到所有的点的访问完。
BFS(广度):可以说是一层一层顶点的访问,类似数的层次遍历,先访问与指定顶点相连的所有顶点(下一层),再按上一层的访问顺序访问下一层顶点各自相连的所有顶点。
5)最小生成树(理论上不唯一,但电脑运行结果唯一):Prim算法和Kruskal算法。
6)最短路径:Dijkstra算法和Floyd算法。
二、易错点
1、图的度的计算,特别是有向图的度要小心。刚开始学的时候不是很清楚,学到后期就比较清楚了。
2、使用遍历算法时,一般都会用上visited数组来储存判断顶点是否被访问过,打过几次代码和看了同学的小结才发现把visited数组设为全局变量会更方便,不然每个调用的函数都要在参数那里设置visited。
三、重点算法:
1、邻接矩阵结构定义:(数组类型看题而议)
typedef struct { int vexs [MVNum] ; //顶点表 int arcs[MVNum) [MVNum); //邻接矩阵 int vexnum,arcnum; //点数和边数 ) AMGraph;
2、邻接表结构定义:
typedef struct ArcNode //边结点 { int adjvex; //该边所指向的顶点的位置 struct ArcNode * nextarc; //指向下一条边的指针 int info; //和边相关的信息 }ArcNode; typedef struct VNode //顶点信息 { int data; ArcNode *firstarc; //指向第一条依附该顶点的边的指针 ) VNode,AdjList[MVNum] ; //AdjList表示邻接表类型
typedef struct //邻接表 { AdjList vertices; int vexnum,arcnum; //图的当前顶点数和边数 }ALGraph;
3、基于邻接矩阵的DFS:(感觉比较常用)
void DFS_AM(AMGraph G, int v) { cout << v ; //访问第v个顶点 visited[v] = true; //访问过则设为true for(w=0; w<G.vexnum; w++) //依次检查邻接矩阵所在的行 if((G.arcs[v][w]!=0)&&(!visited[w])) //如果w是v的邻接点且w未访问 DFS_AM(G,w); //递归调用DFS_AM }
四、心得体会
1、这一章学习的概念内容感觉比较多,感觉结构定义像邻接表的结构定义是比较多个结构体的,有时打代码时会比较混乱,而且图这章很多的算法手动操作明白了但要电脑写代码的时候就不太熟悉,还是要看着书一步一步打才可以。
2、实践题:
开始看题目时还是很迷,主要还是先想好思路再写,想思路还是花的时间比较多,想好了打的时候就会快很多。
思路: 把鳄鱼的坐标存放在一个数组里,把每两个点(鳄鱼)之间的距离算好存放在一个二维数组里,然后遍历数组找到他们之中一点离原点的距离是D之内就“踩过去”,然后再以这点为原点继续上一步的操作(递归),直到判断有某一点离边界的距离是D之内就能能逃脱。若无,则不能逃脱 。