迪杰斯特拉算法-某个源点到其余各点的最短路径-java

 迪杰斯特拉算法-某个源点到其余各点的最短路径-java

时间复杂度:O(n^2)

 

import java.util.Scanner;


public class Main {
	public static void ShortestPast_DIJ(int[][] G,int v0,boolean[][] P,int[] D)
	{
		int v,w;
		boolean[] f=new boolean[G.length];
		
//		printP(P);
		for(v=0;v<G.length;++v)
		{
			f[v]=false; D[v]=G[v0][v];
			for(w=0;w<G.length;++w) P[v][w]=false; //设空路径
			if(D[v]<Integer.MAX_VALUE)
			{
				P[v][v0]=true;
				P[v][v]=true;
			}
		}
//		printP(P);
		D[v0]=0; f[v0]=true;  //初始化,v0顶点属于S集合
		//开始主循环,每次旧的v0到某个顶点v的最短路径,并加v到S集
		for(int i=1;i<G.length;++i) //其余G.length-1个顶点
		{
			int min=Integer.MAX_VALUE;
			for(w=0;w<G.length;++w)
			{
				if(!f[w])		//w顶点在V-S中
					if(D[w]<min)    //w顶点离v0顶点更近
					{
						v=w; min=D[v];
					}
			}
//			System.out.println("#"+v);
			f[v]=true;		//离v0最近的v加入S集
//			System.out.println("old");
//			printP(P);
			for(w=0;w<G.length;++w)   //更新当前最短路径及距离
			{
				if(!f[w]&&(min+G[v][w]<D[w])&&min<Integer.MAX_VALUE&&G[v][w]<Integer.MAX_VALUE)   //修改D[w]和P[w],w属于V-S
				{
					D[w]=min+G[v][w];
					P[w]=P[v].clone(); 
					P[w][w]=true; //P[w]=P[v]+P[w]
				}
			}
//			printP(P);
		}
	}
	public static int[][] readG(Scanner in,int n)
	{
		int[][] G=new int[n][n];
		for(int i=0;i<n;++i)
		{
			for(int j=0;j<n;++j)
			{
				G[i][j]=in.nextInt();
				if(G[i][j]==-1)
					G[i][j]=Integer.MAX_VALUE;
			}
		}
		return G;
	}
	public static void print(int[][] G)
	{
		for(int i=0;i<G.length;i++)
		{
			for(int j=0;j<G.length;++j)
			{
				System.out.print(G[i][j]+" ");
			}
			System.out.println();
		}
	}
	
	public static void printP(boolean[][] P)
	{
		int n=P.length;
		System.out.println();
		for(int i=0;i<n;i++)
		{
			System.out.print(0+":"+i+" ");
			for(int j=0;j<n;j++)
			{
				System.out.print(P[i][j]+" ");
			}
			System.out.println();
		}
	}
	public static void printD(int[] D)
	{
		System.out.println("终点"+"\t最短路径长度");
		for(int i=0;i<D.length;i++)
		{
			if(D[i]<Integer.MAX_VALUE)
				System.out.println(i+"\t"+D[i]);
			else
				System.out.println(i+"\t无");
		}
			
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int[][] G=readG(in,6);
		int v0=0;
		boolean[][] P=new boolean[6][6];
		int[] D=new int[6];
	
//		print(G);	
		ShortestPast_DIJ(G, v0, P, D);
//		printP(P);
		printD(D);
		
	}
	
}
/*
-1 	-1 	10 	-1 	30 	100
-1 	-1 	5 	-1 	-1 	-1
-1	-1	-1	50	-1	-1
-1	-1	-1	-1	-1	10
-1	-1	-1	20	-1	60
-1	-1	-1	-1	-1	-1 

起点 0
终点	最短路径长度
0	0
1	无
2	10
3	50
4	30
5	60

 */