스크린샷 2022-08-27 오후 3.57.45.png

public class MyClass {
    public static void main(String args[]) {
       String[] citys = new String[10];

        citys[0] = "서울";  //0
        citys[1] = "천안";  //1
        citys[2] = "원주";  //2
        citys[3] = "강릉";  //3
        citys[4] = "논산";  //4
        citys[5] = "대전";  //5
        citys[6] = "대구";  //6
        citys[7] = "포항";  //7
        citys[8] = "광주";  //8
        citys[9] = "부산";  //9

        int length = citys.length;

        Graph g = new Graph(); // 노드 수 만큼 그래프 생성
        g.init(length);
        
        // 시작, 끝, 간선 가중치 입력
        g.input(0, 1, 12);  //서울0 천안1 12
        g.input(0, 2, 15);  //서울0 원주2 15
        g.input(1, 4, 4);   //천안1 논산4 4
        g.input(1, 5, 10);  //천안1 대전5 10
        g.input(2, 3, 21);  //원주2 강릉3 21
        g.input(2, 6, 7);   //원주2 대구6 7
        g.input(3, 7, 25);  //강릉3 포항7 25
        g.input(4, 8, 13);  //논산4 광주8 13
        g.input(4, 5, 3);   //논산4 대전5 3
        g.input(5, 6, 10);  //대전5 대구6 10
        g.input(6, 7, 19);  //대구6 포항7 19
        g.input(6, 9, 9);   //대구6 부산9 9
        g.input(7, 9, 5);   //포항7 부산9 5
        g.input(8, 9, 15);  //광주8 부산9 15
        
        // 시작노드 기준 다익스트라 알고리즘 실행
        String[] result = g.dijkstra(0);
        
        for(int i=0; i<result.length; i++) {
          System.out.println("result = " + result[i]);
        }
    }
    
    static class Graph{
    private int n;           // 노드들의 수
    private int maps[][];    // 노드들간의 가중치 저장할 변수
 
public Graph(){
}

public void init(int n) {
        this.n = n;
        maps = new int[n][n];
        
        // 인접행렬 모든 값 무한대로 초기화
        for(int i=0; i<n; ++i){
        	for(int j=0; j<n; ++j){
        	    
        		maps[i][j] = Integer.MAX_VALUE;
        
        	}
        }
}

    public void input(int i,int j,int w){
        
        maps[i][j] = w;
        maps[j][i] = w;
    }
 
    public String[] dijkstra(int v){
        int distance[] = new int[n];          // 최단 거리를 저장할 변수
        boolean[] check = new boolean[n];     // 해당 노드를 방문했는지 체크할 변수
         
        // distance값 초기화. 무한대를 int 자료형의 최대값으로 표현했다.
        for(int i=0; i<n; ++i){
            distance[i] = Integer.MAX_VALUE;
        }
         
        // 시작노드값 초기화.
        distance[v] = 0;
        check[v] = true;
      
        // 연결노드 distance갱신
        for(int i=0; i<n; ++i){
            if(!check[i] && maps[v][i] != Integer.MAX_VALUE){
                distance[i] = maps[v][i];
            }
        }
        
        
        String[] result = new String[n];
        
        for(int a=0; a<n-1; ++a){
            // 원래는 모든 노드가 true될때까지 인데
            // 노드가 n개 있을 때 다익스트라를 위해서 반복수는 n-1번이면 된다.
            // 원하지 않으면 각각의 노드가 모두 true인지 확인하는 식으로 구현해도 된다.
            int min = Integer.MAX_VALUE;
            int min_index = -1;
            
            // 노드 최소값 찾기
            for(int i=0; i<n; ++i){
                if(!check[i]){
                    if(distance[i] < min){
                        min = distance[i];
                        min_index = i;
                    }
                }
            }
            
            // 다른 노드를 거쳐서 가는 것이 더 비용이 적은지 확인한다.
            check[min_index] = true;
            for(int i=0; i<n; ++i){
                if(!check[i] && maps[min_index][i] != Integer.MAX_VALUE){
                    if(distance[min_index] + maps[min_index][i] < distance[i]){
                        distance[i] = distance[min_index] + maps[min_index][i];
                    }
                }
            }
            
            // 결과값 출력
            for(int i=0; i<n; ++i){
                
                String d = "";
                
            	if(distance[i] == 2147483647) {
            	    System.out.print("∞ ");
            	    d = "∞";
            	}
            	else {
            	    System.out.print(distance[i]+" ");
            	    d = distance[i]+" ";
            	}
            	
            	
            	    result[i] = d;
            
            }
            System.out.println("");
        }
        
        return result;
    }
    }
}