本章学习了图的结构和应用,学完之后觉得图其实就是数组与链表的结合。
对于邻接表和十字链表的两种不同的储存结构,对于邻接表来说,优点在于可以储存有向图与无向图,便于增加和删除顶点和统计边的数目,同时它的空间效率也高,对于有向图可以建立逆邻接表;十字链表作为有向图的另一种链式存储。在十字链表中容易找到Vi的尾的弧,也容易找到以Vi为头的弧,因而容易求得顶点的出度和入度。
然后是这一章节的重点,图的遍历,氛围DFS和BFS
对于DFS深度优先搜索来说,这是树先序遍历的推广,按照递归,先沿着一条道走到黑,撞到南墙后,再返回一层,找另一条路继续走,不停返回,不停深入。
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; } }
另一个是BFS广度优先搜索,追求一个覆盖面积,在求最短路径或最优方案时进行使用有明显的优点。BFS利用队列,起始顶点先入队,对于每一个准备入队的顶点进行以下的操作:
1、先访问再入队 对出队元素x 的每个邻接点做判断,如果为访问,则访问后入队。
2、直接入队 对出队元素x 先判断是否访问,访问后,x 的邻接点入队。
因为对于图的知识掌握还不够牢固,觉得自己在这个ddl之前没有办法把PTA的代码写出来,所以重新看了一遍书,查了查CSDN上面一些大牛发布的教程还有心得,算是把课重新上了一遍复习了一遍,然后记录下一些重点的内容,这样做起题来效率就可以搞一些不用做一道题查一堆内容了。
原文:https://www.cnblogs.com/xhongk/p/10891085.html