광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오블완
  • 다이나믹 프로그래밍
  • 드린이
  • BOJ
  • OS
  • 자바
  • DP
  • 애플워치 앱
  • BFS
  • 컴퓨터 사이언스
  • 개념
  • 파이썬
  • 합주
  • 백준
  • 알고리즘
  • 운영체제
  • 애플워치 앱 만들기
  • 티스토리챌린지
  • 구현
  • 프로그래머스

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

알고리즘/문제 풀이

[Java/자바 백준 1504] 특정한 최단 경로

2022. 3. 30. 13:27
반응형

풀이

다익스트라를 이용하는 문제

v1, v2를 꼭 찍어서 N에 도달해야하므로

0 -> v1 -> v2 -> N

0 -> v2 -> v1 -> N

두가지 케이스를 나눠서 다익스트라 진행하면 됩니다.

 

92%에서 계속 틀리신분들

2 0

1 2

이 반례 처리를 안해서 그런거 같습니다 ! 

import java.util.*;
import java.io.*;

public class Main {
	static int V, E;
	static final long INF = Long.MAX_VALUE;
	static List<Node>[] adjList;
	static long[] distance;
	static boolean[] visited;
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		V = Integer.parseInt(st.nextToken());
		E  = Integer.parseInt(st.nextToken());
		if(E == 0) {
			System.out.println(-1);
			return;
		}
		adjList = new ArrayList[V];
		distance = new long[V];
		visited = new boolean[V];
		for(int i = 0 ; i < V ; i++) {
			adjList[i] = new ArrayList<Node>();
			distance[i] = INF;
		}
		for(int i = 0 ; i < E ; i++) {
			st = new StringTokenizer(br.readLine());
			int u = Integer.parseInt(st.nextToken()) - 1;
			int v = Integer.parseInt(st.nextToken()) - 1;
			int w = Integer.parseInt(st.nextToken());
			adjList[u].add(new Node(v, w));
			adjList[v].add(new Node(u, w));
		}
		st = new StringTokenizer(br.readLine());
		int v1 = Integer.parseInt(st.nextToken()) - 1;
		int v2 = Integer.parseInt(st.nextToken()) - 1;
		
		long tmp = 0;
		tmp += dijkstra(0, v1);
		tmp += dijkstra(v1, v2);
		tmp += dijkstra(v2, V-1);
		
		long tmp2 = 0;
		tmp2 += dijkstra(0, v2);
		tmp2 += dijkstra(v2, v1);
		tmp2 += dijkstra(v1, V-1);
		long answer = Math.min(tmp, tmp2);
		if(answer == INF) System.out.println(-1);
		else System.out.println(answer);
		
	}
	private static long dijkstra(int start, int end) {
		
		distance = new long[V];
		visited = new boolean[V];
		Arrays.fill(distance, INF);
		distance[start] = 0;
		
		for(int i = 0 ; i < V ; i++) {
			long min = INF;
			int minVertex = -1;
			for(int j = 0 ; j < V ; j++) {
				if(!visited[j] && distance[j] < min) {
					min = distance[j];
					minVertex = j;
				}
			}
			
			if(minVertex == -1) break;
			visited[minVertex] = true;
			
			for(Node next : adjList[minVertex]) {
				if(!visited[next.v] && distance[next.v] > min + next.w) {
					distance[next.v] = min + next.w;
				}
			}
		}
		return distance[end];
	}
	private static class Node{
		int v, w;
		
		public Node(int v, int w) {
			this.v = v;
			this.w = w;
		}
	}
}
반응형
저작자표시

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java/자바 백준 14226] 이모티콘  (0) 2022.04.14
[Java/자바 SWEA 1953] 탈주범 검거  (0) 2022.04.11
[Java/자바 백준 1459] 걷기  (0) 2022.03.29
[Java/자바 백준 1781] 컵라면  (0) 2022.03.29
[Java/자바 백준 23290] 마법사 상어와 복제  (0) 2022.03.28
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 백준 14226] 이모티콘
    • [Java/자바 SWEA 1953] 탈주범 검거
    • [Java/자바 백준 1459] 걷기
    • [Java/자바 백준 1781] 컵라면
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바