任意兩節點之間最短距離

思路就是:

找到這兩個節點的最近公共父節點,然後重根遍歷  計算到父節點的距離  兩個點的距離-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];
	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章