描述
算法过程
代码实现
package com. atguigu. dijkstra; import com. sun. xml. internal. fastinfoset. algorithm. BooleanEncodingAlgorithm; import javax. sound. midi. Soundbank;
import java. util. Arrays;
import java. util. TimerTask; public class DijkstraAlgorithm { public static void main ( String[ ] args) { char [ ] vertex = { 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' } ; int [ ] [ ] matrix = new int [ vertex. length] [ vertex. length] ; final int N = 65535 ; matrix[ 0 ] = new int [ ] { N, 5 , 7 , N, N, N, 2 } ; matrix[ 1 ] = new int [ ] { 5 , N, N, 9 , N, N, 3 } ; matrix[ 2 ] = new int [ ] { 7 , N, N, N, 8 , N, N} ; matrix[ 3 ] = new int [ ] { N, 9 , N, N, N, 4 , N} ; matrix[ 4 ] = new int [ ] { N, N, 8 , N, N, 5 , 4 } ; matrix[ 5 ] = new int [ ] { N, N, N, 4 , 5 , N, 6 } ; matrix[ 6 ] = new int [ ] { 2 , 3 , N, N, 4 , 6 , N} ; Graph graph = new Graph ( vertex, matrix) ; graph. showGraph ( ) ; graph. dsj ( 2 ) ; graph. showDijkstra ( ) ; } } class Graph { private char [ ] vertex; private int [ ] [ ] matrix; private VisitedVertex vv; public Graph ( char [ ] vertex, int [ ] [ ] matrix) { this . vertex = vertex; this . matrix = matrix; } public void showDijkstra ( ) { vv. show ( ) ; } public void showGraph ( ) { for ( int [ ] link : matrix) { System. out. println ( Arrays. toString ( link) ) ; } } public void dsj ( int index) { vv = new VisitedVertex ( vertex. length, index) ; update ( index) ; for ( int j = 1 ; j < vertex. length; j++ ) { index= vv. updateArr ( ) ; update ( index) ; } } private void update ( int index) { int len= 0 ; for ( int j = 0 ; j < matrix[ index] . length; j++ ) { len= vv. getDis ( index) + matrix[ index] [ j] ; if ( ! vv. in ( j) && len< vv. getDis ( j) ) { vv. updatePre ( j, index) ; vv. updateDis ( j, len) ; } } } }
class VisitedVertex { public int [ ] already_arr; public int [ ] pre_visited; public int [ ] dis; public VisitedVertex ( int length, int index) { this . already_arr= new int [ length] ; this . pre_visited= new int [ length] ; this . dis= new int [ length] ; Arrays. fill ( dis, 65535 ) ; this . already_arr[ index] = 1 ; this . dis[ index] = 0 ; } public boolean in ( int index) { return already_arr[ index] == 1 ; } public void updateDis ( int index, int len) { dis[ index] = len; } public void updatePre ( int pre, int index) { pre_visited[ pre] = index; } public int getDis ( int index) { return dis[ index] ; } public int updateArr ( ) { int min= 65535 , index= 0 ; for ( int i = 0 ; i < already_arr. length; i++ ) { if ( already_arr[ i] == 0 && dis[ i] < min) { min= dis[ i] ; index= i; } } already_arr[ index] = 1 ; return index; } public void show ( ) { System. out. println ( "=================" ) ; for ( int i: already_arr) { System. out. print ( i+ " " ) ; } System. out. println ( "=================" ) ; for ( int i: pre_visited) { System. out. print ( i+ " " ) ; } System. out. println ( "=================" ) ; for ( int i: dis) { System. out. print ( i+ " " ) ; } System. out. println ( ) ; char [ ] vertex = { 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' } ; int count= 0 ; for ( int i: dis) { if ( i!= 65535 ) { System. out. print ( vertex[ count] + "(" + i+ ")" ) ; } else { System. out. println ( "N" ) ; } count++ ; } System. out. println ( ) ; } }