任意两节点之间最短距离

通过找到节点的最近公共父节点,利用重根遍历计算到父节点的距离,进而求得任意两点间最短距离。算法实现采用TarJan方法。
摘要由CSDN通过智能技术生成

思路就是:

找到这两个节点的最近公共父节点,然后重根遍历  计算到父节点的距离  两个点的距离-2*父节点的距离  就是所求的了

TarJan

package com.graph;

import java.util.Scanner;
import java.util.Vector;
/*
 * 
 * 
 * Tarjan 算法实现最近公共父节点
 */

public class LCA {
	private static int [][]Gra = new int[100][100];
	private static int [][]res = new int[100][3];
	private static int []fa = new int[100];
	private static int []vis = new int[100];
	private static int []dis = new int[100];
	private static Vector<Integer> []query = new Vector[100];

	

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n  = in.nextInt();
		int m = in.nextInt();
		for(int i = 1;i<=n;i++)
		{
			int u = in.nextInt();
			int v = in.nextInt();
			int d = in.nextInt();
			Gra[u][v] = d;
			Gra[v][u] = d;
			
		}
		for(int i = 0;i<100;i++)
		{
			query[i] = new Vector&l
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在拓扑中,任意节点之间的加权最短路径可以使用Dijkstra算法或者Bellman-Ford算法来计算。 Dijkstra算法: Dijkstra算法是一种贪心算法,用于计算从一个起点到所有其他节点的最短路径。它通过维护一个距离数组,记录起点到每个节点的距离,并按照距离从小到大的顺序访问未访问过的节点,更新距离数组,直到所有节点被访问。 具体步骤如下: 1. 初始化距离数组,将起点的距离设为0,其他节点的距离设为无穷大。 2. 从起点开始,将起点标记为已访问,将起点的直接邻居节点加入未访问节点的集合中。 3. 对于未访问节点集合中的每个节点,计算从起点到该节点的距离,如果该距离小于当前距离数组中的距离,则更新距离数组。 4. 选择距离数组中值最小的节点,将其标记为已访问,将其直接邻居节点加入未访问节点集合中。 5. 重复步骤3和4,直到所有节点都被访问。 Bellman-Ford算法: Bellman-Ford算法是一种动态规划算法,用于计算从一个起点到所有其他节点的最短路径。它通过对所有边进行松弛操作,逐步减小起点到每个节点的距离数组的值,直到收敛。 具体步骤如下: 1. 初始化距离数组,将起点的距离设为0,其他节点的距离设为无穷大。 2. 对于每个节点,对其所有出边进行松弛操作,即如果从该节点到另一个节点的距离小于距离数组中的距离,则更新距离数组。 3. 重复步骤2,直到距离数组不再改变或者进行了N-1次松弛操作(N为节点总数)。 4. 如果存在负权环,则可以进行第N次松弛操作,距离数组中会出现负无穷大。 总之,Dijkstra算法适用于稠密图,时间复杂度为O(N^2),但可以通过使用优先队列将时间复杂度优化为O(NlogN)。Bellman-Ford算法适用于稀疏图,时间复杂度为O(NE),其中E为边数,N为节点数。同时,Bellman-Ford算法还可以检测负权环,而Dijkstra算法不能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值