与传递闭包问题
非常相似的一个问题是,能不能给出一个矩阵,根据矩阵可以以时间代价O(n)的方式得到在一个有向代权图中任意指定端点之间的最短距离。求的这个矩阵的问题被称为每一对端点间的最小距离问题。
这里采用的是Floyd算法,它与WalShall
算法非常相似:
如果A可以到达B,距离为x,且C可以到达A,距离为y,则求得C可以到达B,距离为 z = x + y,z小于如果c到B的原来的距离,则用z更新矩阵,否则c到B距离维持不变。
和最小路径算法类似,这里用一个很大数字INFINITY来表示两个端点之间距离为无穷大的情况,即不通。这里INFINITY=最大的int值(~(1<<31))。
Floyd.main()提供简单的测试。
与WalShall
一样,Floyd算法本身的时间代价为O(n^3)
代码如下:
class Floyd {
private int[][] adjMat;
private static final int INFINITY = ~(1<<31);
Floyd(int size) {
adjMat = new int[size][size];
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
adjMat[i][j] = INFINITY;
}
void connect(int from, int to, int length) {
adjMat[from][to] = length;
}
void floyd() { //floyd算法
for(int y=0; y<adjMat.length; y++) //查找每一行
for(int x=0; x<adjMat.length; x++) // 查找每个单元格
if(adjMat[y][x] != INFINITY) //如果 y 可以到达 x
for(int z=0; z<adjMat.length; z++) //查找所有行的y列
//如果 z 可以到达y ,说明z
//可以直接到达x,如果算出来的新距离小于原来的距离,则更新
if(adjMat[z][y] != INFINITY) {
int newLength = adjMat[z][y] + adjMat[y][x];
adjMat[z][x] = newLength < adjMat[z][x] ? newLength : adjMat[z][x];
}
}
int[][] getConnections() {
return adjMat;
}
public static void main(String[] args) {
Floyd w = new Floyd(5);
w.connect(1,0,70);
w.connect(2,0,30);
w.connect(1,3,10);
w.connect(3,2,20);
for(int[] a: w.getConnections()) {
for(int i: a) System.out.print((i == INFINITY? "INF" : i) + "\t");
System.out.println();
}
w.floyd();
System.out.println("==================");
for(int[] a: w.getConnections()) {
for(int i: a) System.out.print((i == INFINITY? "INF" : i) + "\t");
System.out.println();
}
}
}
分享到:
相关推荐
为了找到两条线段之间的最大和最小距离,我们可以遍历每一对线段上的点,然后计算每对点之间的距离。在所有这些距离中找到最大值和最小值即可。 ```csharp public static double DistanceBetweenSegments(Line...
2. 动态规划:根据曲线的参数化,遍历每对点,计算当前步长下的最小距离,并更新距离矩阵。 3. 返回结果:当所有点都被处理后,返回距离矩阵中的最大值,即为弗雷歇距离。 在实际应用中,弗雷歇距离有多种变体和...
本实验的目标是让学生理解如何计算二维平面上四点间的最短距离,并能够选出与其他三点距离之和最小的那个点。 **实验原理** 1. **计算两点间距离**: - 使用欧几里得距离公式:\(d=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2...
**穷举搜索法**:分别计算点集中每一对点之间的距离,从中找出距离最小的点对。为了避免重复计算,算法只考虑i 的情况。这种方法的时间复杂度为O(n^2)。 **分治法**:将给定的点集S分成两个子集S1和S2,递归地求解...
10. **判断线段是否与线段相交**:计算每对端点之间的距离,若存在一对距离之和小于或等于两线段长度之和,则相交。 11. **获取两点间的角度值(0 到 360)**:利用反正切函数arctan2计算角度,再转换为0到360度...
- **定义**:如果图中的任何一对顶点可以通过图的自同构映射到另一对顶点上,则称该图为顶点传递图。 - **性质**:这部分探讨了顶点传递图的性质及其在图论中的重要性。 ##### 4.3 对称图 - **定义**:对称图是一类...
- 点:在二维空间中,点是最基本的元素,通常用一对坐标(x, y)表示。 - 直线:由两个不同点决定,可以通过两点式或斜截式来定义。 - 线段:两个端点之间的有限长度直线。 - 圆:所有离固定点(圆心)等距离的点...
2. 依次考虑每条边,如果这条边的两端不在同一个集合中,则将这条边加入最小生成树,并将这两个端点所在的集合合并。 3. 重复步骤2,直到最小生成树包含所有顶点。 #### 六、Dijkstra算法求单源最短路径 **原理:*...
- **费马点问题**:寻找一个点,使其到三角形三个顶点的距离之和最小。 5. **实例分析**: - 在等边三角形中,利用旋转将线段转化为同一三角形内部,证明线段之和的关系。 - 菱形构造问题,探讨点D在不同位置时...
- 在A站和B站之间有3个额外的车站,每两个站点之间都有一对往返车票,所以总的车票种类是(2+3+4)×2=20种。 7. 三点共线与线段长度: - 当A、B、C三点在同一条直线上,线段AB和BC的长度确定,AC的长度等于AB加上...
聚沙成塔部分涉及到最优化问题,如找到点P,使得PA+PB的值最小,这通常涉及到两点间直线距离的性质。例如,点A(2,1),B(1,3),在x轴上找点P,使得PA+PB的最小值是17/4,点P坐标为(7/4,0)。 这些题目覆盖了...
**计算距离**:根据某种相似度度量(如欧氏距离)计算每一对点之间的距离。 3. **累积成本计算**:递归地填充矩阵中的每一个单元格,每个单元格的值代表到达当前位置的最低累积成本。 4. **回溯路径**:从最后一...
- 在实际应用中,图中的每条边可能会被赋予一个权重值,这个权重可以代表距离、成本等具体数值。这样的图被称为赋权图。 - 赋权图的表示方式通常为 (G, w),其中 w 表示边的权重函数。 4. **图的相关术语** - **...
**凸集**定义为在欧几里得空间中,如果集合内的每一对点之间的连线段上的所有点也都属于该集合,则该集合被称为凸集。例如,在二维平面上,任何两个点之间画一条直线,如果这条直线上的所有点都在这个集合内部,那么...
奇偶点图上作业法是将奇点配成对,每一对奇点之间必有一条链,把这条链的所有边作为重复边加到图中去,新图中必无奇点。最小二分匹配法是将图分为两个部分,每个部分包含一个奇点,然后使用二分匹配算法来找到最小...
例如,对于一个拉杆式旅行箱,要使其静止,需画出作用在端点A的最小作用力F,通过杠杆平衡条件计算出F的大小。 2. **力或力臂变化问题**:利用杠杆平衡条件F1L1=F2L2,结合控制变量法,分析力或力臂的变化对平衡的...
3. **构建代价矩阵**:将提取的特征参数转化为序列,然后计算测试序列与模板序列之间每一对对应帧的欧氏距离,填入代价矩阵。 4. **动态规划**:使用动态规划方法寻找代价矩阵中的最优路径。路径必须满足两个条件:...
这个过程可以用动态规划的递推公式来描述,即当前点的累积距离是其相邻三个点的最小距离加上当前帧的匹配距离。 DTW算法的优势在于它可以处理非线性的时间变化,例如说话速度的变化,这在实际语音中很常见。与直接...
3. **最远点对确定**:在所有找到的对跖点对中选取距离最远的一对作为最终结果。 #### 结论 本文提出的方法充分利用了凸包和对跖点对的特性,通过先计算凸包再求解对跖点对的方式,有效降低了时间复杂度至O(nlogn)...