图
我想有个夏天
希望生活简单点
展开
-
骑士周游算法(跳马)
骑士周游算法:主要就是两个思想深度遍历和回溯,以当前点为目标,算出下一个能走的点的集合,然后以下一个能走的目标,然后算出下下个能走的目标,最后不能走时,看有没有完成,没有完成就回退,这里需要一个辅助数组来进行判断点是否有没有走。接下来就是算法了//标记点位是否走过private boolean[] flag;//多少行,这里设置成8行8列private int Y = 8;private int X = 8;//标记算法是否完成private boolean isComplete = fal原创 2020-11-06 22:16:53 · 928 阅读 · 0 评论 -
迪杰斯特拉算法(Dijkstra)-Java实现
迪杰斯特拉算法也是求两点之间最短路径的算法,它的思想和普利姆算法有点相似,不断通过已找到点集合和未找到点之间的集合之间的最短路径。这个算法需要用到三个数组,一个是存储结点是否已经访问,一个是结点到起始点的最短距离,还有一个是结点到起始点第一个需要经过的点。我们不断通过迭代更新这三个数组,最终就可以得到每个点到起始点的最短距离数组了。接下来可以结合代码理解,我也把代码注释写的尽量详细。//是否已经访问过private boolean[] isVisited;//第一个经过的结点private in原创 2020-11-06 21:50:42 · 288 阅读 · 0 评论 -
弗洛伊德算法(floyd)
弗洛伊德算法和迪杰斯特拉算法都是求两点之间最短路径的问题,弗洛伊德算法使用了动态规划的思想,用二维矩阵记录了所有点之间最短的距离,虽然代码只有几行,但是思想还很值得回味的。其主要的思想就是两个点之间的直接距离能否使用第三个点来缩短。公式:vj > vk + kj,这个公式讲的就是,三个点v,j,k。v点如果需要到j点,v直接到j的距离,是否要大于v到某个中间点k的距离加上k到点的距离,然后依次遍历所以点为中间点,就可以得出所有点之间的最短距离,这样讲可能有点很难理解。下面我举个例子吧。比如现在有5原创 2020-11-06 20:50:05 · 1038 阅读 · 0 评论 -
克鲁斯卡尔算法(kruskal)
我自己感觉,克鲁斯卡尔算法比普利姆算法更好理解,它就两个要点,排序和判断是否成环。排序:我们把两两相邻的边根据边的权值,从小到大依次排序,这个十大排序算法可以自己选一个去实现下,刚好还可以回忆下以前的算法,下面我们使用冒泡来实现边的排序。是否成环:这个也是这个算法里比较难的一个点了,这里使用了并查集,每次添加一条边时候,我们需要去寻找这两个点是否有相同的父节点,如果有说明成环了,我们就可以选择下一条边了,直到有n-1条边。如果不了解并查集的,可以看看下面这一篇文章,讲的很通俗易懂。(https://原创 2020-11-05 22:52:35 · 625 阅读 · 0 评论 -
普利姆算法(Prim)
普利姆算法和克鲁斯卡尔算法都是求连接图中所有结点的最短路径,也就是最小生成树。普利姆算法其实就是不断获取已经访问结点和未访问结点之间的最短边来获取所有结点间的最短路径,也可以认为是广度+贪婪。接下来看算法的实现,这里只给出关键代码,基本的图数据结构可以自己实现。//结点数量private int[] vertexs;//矩阵实现图private int[][] edges;//n:为指定开始的结点public void prim(Graph graph , int n) { //这里我们需要原创 2020-11-05 22:07:58 · 807 阅读 · 0 评论 -
图的深度遍历和广度遍历(java实现)
在说图的广度遍历和深度遍历之前,我们可以回想下,树的先序遍历和层次遍历,先序遍历我们是不是从根节点一直递归到叶子节点,然后再慢慢回退,图的深度遍历也是类似的。图的深度遍历,只需要额外一个数组记录顶点是否有访问过,下面就使用矩阵来实现图,和图的深度遍历。//这里n为顶点的数量private boolean[] isVisited = new boolean[n];//这里为矩阵构建的图1为边private int[][] edges;public void dfs(int n){ //这里打印对原创 2020-11-04 23:10:21 · 310 阅读 · 0 评论