任意两节点之间最短距离

来源:互联网 发布:崔成国 知乎 编辑:程序博客网 时间:2024/05/29 16:31

思路就是:

找到这两个节点的最近公共父节点,然后重根遍历  计算到父节点的距离  两个点的距离-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<Integer>();}for(int i = 1;i<=m;i++){int u = in.nextInt();int v = in.nextInt();query[u].add(v);query[v].add(u);res[i][0] = u;res[i][1] = v;}dis[1] = 0;Tarjan(1);for(int i = 1;i<2;i++){System.out.println(dis[res[i][0]]+dis[res[i][1]]-2*dis[res[i][2]]);}}private static void Tarjan(int u) {vis[u] = 1;fa[u] = u;for(int i = 0;i<query[u].size();i++){if(vis[query[u].get(i)]==1){for(int j = 1;j<=5;j++)if(res[j][0]==u&&res[j][1]==query[u].get(i) || res[j][0]==query[u].get(i)&&res[j][1]==u){res[j][2] =find(query[u].get(i));break;}}}for(int i = 1;i<=5;i++){if(Gra[u][i]>0)if(vis[i]==0){dis[i] = dis[u]+Gra[u][i];Tarjan(i);fa[i] = u;}}}private static int find(Integer x) {// TODO Auto-generated method stubif(x!=fa[x])fa[x] =find(fa[x]);return fa[x];}}


0 0