ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 11657 타임머신 #JAVA 출력초과
    Algorithm Solving/BAEKJOON 2021. 2. 7. 23:59

    BAEKJOON [11657] 타임머신 


    코드


     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.StringTokenizer;
    
    class Node{
    	int start;
    	int end;
    	int dist;
    	
    	public Node(int start, int end, int dist) {
    		this.start = start;
    		this.end = end;
    		this.dist = dist;
    	}
    }
    
    public class Main {
    
    	public static void main(String[] args) throws IOException{
    		BufferedReader br = new  BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st ;
    		
    		st = new StringTokenizer(br.readLine());
    		
    		int n = Integer.parseInt(st.nextToken()); //노드의 갯수  
    		int m = Integer.parseInt(st.nextToken()); //간선의 갯수 
    		
    		List<Node> list = new ArrayList<>();
    		
    		for (int i = 0; i < m; i++) {
    			st = new StringTokenizer(br.readLine());
    			int start = Integer.parseInt(st.nextToken());
    			int end = Integer.parseInt(st.nextToken());
    			int dist = Integer.parseInt(st.nextToken());
    	
    			list.add(new Node(start, end, dist));
    		}
    		
    		bellmanFord(n, list);
    
    	}
    	
    	static void bellmanFord(int n, List<Node> list) {
    		
    		boolean flag = false;
    		
    		long[] distance = new long[n+1]; //int 자료형은 출력 초과
    		Arrays.fill(distance, Integer.MAX_VALUE);
    		
            distance[1] = 0; //출발 1에서 시작, 자기자신 초기화
    		
    		for (int i = 0; i < n; i++) {
    			
    			//모든 간선 확인
    			for (int j = 0; j < list.size(); j++) {
    				int s = list.get(j).start;
    				int e = list.get(j).end;
    				int d = list.get(j).dist;
    				
    				if(distance[s] != Integer.MAX_VALUE && distance[e] > distance[s] + d) {
    					distance[e] = distance[s] + d;
    					
    					if(i == n-1) flag = true; // 마지막 반복에서도 값이 갱신된다면 음의 순환 존재 
    				}
    				
    			}
    		}
    		
    		if(flag) {
    			System.out.println("-1");
    		}else {
    			StringBuilder sb = new StringBuilder();
    			
    			for (int i = 2; i <= n; i++) {
    				if(distance[i] == Integer.MAX_VALUE) {
    					sb.append("-1\n");
    				}else {
    					sb.append(distance[i]+"\n");
    				}
    			}
    			
    			System.out.println(sb.toString());
    		}
    		
    	}
    
    }
    

     

     

     

     

    풀이


    • 벨만포드
    • 출력초과로 당황했던 문제
    • N = 500, M = 6000 인 경우 최대 300만번의 반복문을 돌게 된다. 이때 음의 간선이 -10,000 이라면 약 -300억의 값으로 underflow가 발생하게 되어 출력초과가 나오는 경우가 발생한다. 때문에 거리배열의 자료형을 long으로 선언해야 했다.

     

     


    잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)

     

     

    글올리기전에 태그 작성하고,,, <hr> 제대로 나오는지 미리보기로 확인하고 올리자!!!!

    'Algorithm Solving > BAEKJOON' 카테고리의 다른 글

    [백준] 11403 경로찾기 #JAVA  (0) 2021.02.15
    [백준] 11404 플로이드 #JAVA  (0) 2021.02.15
    [해커랭크] Two Strings #JAVA  (0) 2021.02.01
    [백준] 1300 K번째 수 #JAVA  (0) 2021.02.01
    [백준] 1021 회전하는 큐 #JAVA  (0) 2021.01.31

    댓글