数据结构第六章小结
第六章主要学习图,感觉有蛮多概念和算法要去记住,可能会造成混淆;
在学习过程中,感觉不是实打实的掌握,还得多看看书。
思维导图如下
个人小测中
1、使用邻接矩阵a存储无向网络,若i号顶点与j号顶点之间不存在边,则a[i][j]值为多少
连通图中 邻接矩阵 连通为1,不连通为0,无向网络连通为权值,不连通为无穷或者是选择一个不与其他权值混淆的最大值。
2、如果从无向图的任一顶点出发进行一次深度优先搜索可访问所有顶点,(不论是深度优先还是广度优先)
连通图,连通分量为其本身(注意审题意)
作业题
1、对于带权无向图 G = (V, E),M 是 G 的最小生成树,则 M 中任意两点 V1 到 V2 的路径一定是它们之间的最短路径
错误;从最小生成树的算法来看,有一个相似的步骤,都是从中选择最小且不会造成回路的权值,在选择过程中是比较目前顶点的邻接点的边的权值大小,题意是任意两点,
这是无法保证的,例如a到b权值3,a到c权值为4,b到c权值为5,按照算法路径为a到b,a到c,本身b到c最短路径为5,而所建构路径为7,并不是最短路径。
2、P 是顶点 S 到 T 的最短路径,如果该图中的所有路径的权值都加 1,P 仍然是 S 到 T 的最短路径。
错误;如果p是由多顶点连接而成,权值都加1,无法保证最终会小于其他路径(如s到t自身连通,权值为12,而目前P最短路径为11,权值都加1,那么此时P并不再是最短路径)。
实践题
题目会使用到类似图的DFS算法
解题思路 先存储到一个记录坐标数组,同时建立一个辅助数组visit,记录是否已被访问 从0开始遍历 首先需要保证第一步在允许范围内可以到达i点 (d+7.5)*(d+7.5) >= p[i].x*p[i].x + p[i].y*p[i].y) 不可以则访问下一个下标,如果可以调用算法,记录visit[i]被访问; 判断是否直接从i到岸,能则直接返回; if(d >= 50 - fabs(p[i].x) || d >= 50 - fabs(p[i].y)) return true; 不能则继续判断 能否从i到j,在判断是否到岸,即使用递归算法 else { for(int j = 0; j < N; j++){ if(!visited[j] && (d*d >= (p[i].x-p[j].x)*(p[i].x-p[j].x) + (p[i].y-p[j].y)*(p[i].y-p[j].y)))//未被访问且能从i跳到j { if(DFS(j)) { return true; break;}//由于使用递归,得到成功答案还需要返回bool值以及退出递归 } } }