[BOJ] 백준 14284. 간선 이어가기2

2024. 3. 19. 10:33· Java/BOJ

문제

https://www.acmicpc.net/problem/14284

 

14284번: 간선 이어가기 2

정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다.

www.acmicpc.net


풀이

전형적인 다익스트라 문제입니다. 

 

다익스트라 알고리즘을 사용할 수 있는 조건이 몇 가지가 있습니다.

 

1. 가중치는 모두 0 이상이어야 한다.

2. 방향 그래프를 가정으로 둔다. 

3. 사이클이 없어야 한다.

 

위 문제에서는 무방향 그래프가 주어졌기 때문에, 간선을 분리해서 방향 그래프로 바꾸었습니다.


소스 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

public class B14284_간선이어가기2 {

    static int N,M;
    static int s,t;
    static int INF = 987654321;
    static int[] dist;
    static ArrayList<Node>[] list;
    static class Node implements Comparable<Node>{
        int v;
        int w;
        Node(int v, int w){
            this.v = v;
            this.w = w;
        }

        @Override
        public int compareTo(Node o){
            return w-o.w;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
        dist = new int[N+1];
        Arrays.fill(dist, INF);
        list = new ArrayList[N+1];
        for(int i = 0; i<N+1;i++){
            list[i] = new ArrayList<>();
        }

        for(int i = 0; i<M;i++){
            int a = sc.nextInt();
            int b = sc.nextInt();
            int w = sc.nextInt();
            list[a].add(new Node(b, w));
            list[b].add(new Node(a,w));
        }
        s = sc.nextInt();
        t = sc.nextInt();
        dikstra(s);
        System.out.println(dist[t]);
    }

    static void dikstra(int st){
        PriorityQueue<Node> queue = new PriorityQueue<>();
        queue.add(new Node(st, 0));
        dist[st] = 0;

        while(!queue.isEmpty()){
            Node node = queue.poll();
            int v = node.v;
            int w = node.w;
            if(dist[v]<w) continue;
            for(int i = 0; i<list[v].size();i++){
                Node next = list[v].get(i);
                int v2 = next.v;
                int w2 = w+next.w;
                if(dist[v2]>w2){
                    dist[v2] = w2;
                    queue.add(new Node(v2, w2));
                }
            }
        }
    }
}

'Java > BOJ' 카테고리의 다른 글

[BOJ] 백준 19949. 영재의 시험  (0) 2024.03.21
[BOJ] 백준 2003. 수들의 합 2  (0) 2024.03.20
[BOJ] 백준 1806. 부분 합  (0) 2024.03.19
[BOJ] 백준 19951. 태상이의 훈련소 생활  (0) 2024.02.27
[BOJ] 백준 25195. Yes or yes  (0) 2024.02.26
'Java/BOJ' 카테고리의 다른 글
  • [BOJ] 백준 19949. 영재의 시험
  • [BOJ] 백준 2003. 수들의 합 2
  • [BOJ] 백준 1806. 부분 합
  • [BOJ] 백준 19951. 태상이의 훈련소 생활
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (178)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (33)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (6)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Java
  • 네트워크
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • 자바
  • 이석복
  • 인프런
  • 반효경
  • 운영체제
  • 자바스크립트
  • 한양대
  • 김영한
  • BOJ
  • 스택
  • JCF
  • 구현
  • OS
  • 프로그래머스
  • 레디스
  • 큐
  • 백준

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[BOJ] 백준 14284. 간선 이어가기2
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.