思路就是:
找到這兩個節點的最近公共父節點,然後重根遍歷 計算到父節點的距離 兩個點的距離-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 stub
if(x!=fa[x])
fa[x] =find(fa[x]);
return fa[x];
}
}