vex

Java室内最短路径搜索(支持多楼层)

感情迁移 提交于 2020-08-10 06:40:33
修改了上次的代码,现在支持室内的多楼层情况下的最短路径搜索,还是使用A*算法,把在GraphAdjList中VNode没有利用起来的data字段作为我们存储楼层属性的位置。 实际上是我偷懒了,正常情况下VNode里应该再加一个int level属性,而data还是作为绑定用户想添加任意类型的数据的一个位置来使用,这样例如当用户想对任意节点添加String类型的描述时,声明GraphAdjList<String>即可,但现在我们的GraphAdjList只能声明为GraphAdjList<Integer>,因为我们把data作为楼层属性来使用,名存实亡的模板类hh。 用户添加节点时使用GraphAdjList.insertVex(E v,int index,int x,int y),v 楼层,index 节点的唯一序列号(从1开始,符合生活习惯),x,y是点坐标,添加边的操作与上次不变。 需要注意的是,在我们的A*代码中,f=g+h,启发函数h设置的可能不是很理想,我们仍旧沿用了x,y的曼哈顿距离,未考虑楼梯口位置和层数等因素的影响,如果遇到起点终点都在所属层的中心位置,楼梯电梯在每层的边缘,搜索方向会先往中心扩展,直到没有结果时,才会往边缘扩展,随后扩展到楼上或楼下,在这种情况下效率可能不佳,但仍旧能获得最短路径。简而言之,就是在我们现在设计的h下

图的基础知识(二、存储)

纵然是瞬间 提交于 2020-01-09 23:29:20
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 图需要存储的信息有以下这些 1、顶点信息 2、边或弧的信息,如果有权,也需要表示出来 3、顶点个数、边(弧)的个数 邻接矩阵及其实现 顶点数据存储: 一维数组 边(弧)信息存储 邻接矩阵 图中n个顶点之间相邻关系的n阶矩阵(即二维数组a[n][n]) 下面举例说明 无向图邻接矩阵,中间斜着的一条线上的0,代表的意义是同一顶点,其余部分,1代表2顶点之间有边,0代表无边。 无向网邻接矩阵,中间斜着的一条线上的0,代表的意义是同一顶点,其余部分,用一个大于所有边的权值的值来表示没有没有边,具体的值表示边上的权值。 有向图邻接矩阵,有几个特点,不一定对称,行方向上的非0元素的个数意味着该顶点的出度,列方向上的非0元素的个数意味着该顶点的入度。 邻接矩阵法的优点: 容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点 邻接矩阵法的缺点: n个顶点,需要n*n个单元存储边(弧),空间效率为O(n2), 对于稀疏图的话,尤其浪费空间 图的java定义,图当中顶点类型为int,然后有4个顶点,6条边(弧),该定义既可以表示有向图,也可以表示无向图,同时也可以表示有整形权的网。 public class Graph { int vn; int en; int[] vex; int[][] arc;

分支限界---单源最短路径

醉酒当歌 提交于 2019-12-17 17:43:08
#分支限界 -- - 单源最短路径 # include <iostream> # include <bits/stdc++.h> using namespace std ; # define inf 0x3f3f3f int c [ 100 ] [ 100 ] ; int dist [ 100 ] ; int prev [ 100 ] ; int n ; struct Vex { int i ; int length ; bool operator < ( const Vex & v ) const { return length > v . length ; } Vex ( ) { } ; Vex ( int v , int l ) { i = v ; length = l ; } } ; void shortest ( int v0 ) { priority_queue < Vex > Q ; Vex E ; E . i = v0 ; E . length = 0 ; Q . push ( E ) ; dist [ v0 ] = 0 ; while ( ! Q . empty ( ) ) { E = Q . top ( ) ; for ( int j = 1 ; j <= n ; j ++ ) { if ( ( c [ E . i ] [ j ] < inf ) && ( c

2018 ccpc final

匿名 (未验证) 提交于 2019-12-03 00:14:01
2018 CCPC FINAL kunkun全球后援队训练赛赛 A. 签到 笨比mwh wa了两发 #include <stdio.h> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #pragma GCC optimize(2) using namespace std; typedef long long ll; const int N = 1e5 + 5; int t, n, m, kas; struct node{ int d, t; }list[N]; bool cmp(node a, node b){ if (a.d == b.d) return a.t < b.t; return a.d < b.d; } int main() { // cin.tie(0); // cout.tie(0); // ios::sync_with_stdio(0); cin >> t; kas = 0; while (t--) { cin >> n >> m; for (int i = 0; i < n; ++i) cin >> list[i].d; for (int i = 0; i < n; ++i) cin >> list[i].t; sort(list, list + n,

2018 ccpc final

折月煮酒 提交于 2019-12-01 07:17:26
2018 CCPC FINAL kunkun全球后援队训练赛赛 A. 签到 笨比mwh wa了两发 #include <stdio.h> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #pragma GCC optimize(2) using namespace std; typedef long long ll; const int N = 1e5 + 5; int t, n, m, kas; struct node{ int d, t; }list[N]; bool cmp(node a, node b){ if (a.d == b.d) return a.t < b.t; return a.d < b.d; } int main() { // cin.tie(0); // cout.tie(0); // ios::sync_with_stdio(0); cin >> t; kas = 0; while (t--) { cin >> n >> m; for (int i = 0; i < n; ++i) cin >> list[i].d; for (int i = 0; i < n; ++i) cin >> list[i].t; sort(list, list + n,

深度优先搜索与广度优先搜索

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-30 02:36:59
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/sunone_/article/details/83717938 广度优先搜索(宽度优先搜索,BFS)和深度优先搜索(DFS)算法的应用非常广泛,本篇文章主要介绍BFS与DFS的原理、实现和应用。 深度优先搜索 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 显然,深度优先搜索是一个递归的过程。 下面进行说明: 第1步:访问A。 第2步:访问(A的邻接点)C。在第1步访问A之后,接下来应该访问的是A的邻接点,即"C,D,F"中的一个。但在本文的实现中,顶点ABCDEFG是按照顺序存储,C在"D和F"的前面,因此,先访问C。 第3步:访问(C的邻接点)B。在第2步访问C之后,接下来应该访问C的邻接点,即"B和D"中一个(A已经被访问过,就不算在内)。而由于B在D之前,先访问B。 第4步:访问