티스토리 뷰

알고리즘/백준

백준 14938 (서강그라운드) - java

김다미김태리신시아 2023. 8. 23. 14:24

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

 

14938번: 서강그라운드

예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을

www.acmicpc.net

유형 : 다익스트라 or 플로이드 - 워셜

접근 : 다익스트라 (우선순위 큐 사용)

코드

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

public class Main {
    static int n = 0;
    static int m = 0;

    static int r = 0;

    static int[] item;

    static ArrayList<Node>[] graph;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        r = Integer.parseInt(st.nextToken());

        item = new int[n+1];
        graph = new ArrayList[n+1];

        st = new StringTokenizer(br.readLine(), " ");
        for(int i=1;i<=n;i++){
            item[i] = Integer.parseInt(st.nextToken());
            graph[i] = new ArrayList<>();
        }


        for(int i=1;i<=r;i++){
            st = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());

            graph[a].add(new Node(b,v));
            graph[b].add(new Node(a,v));
        }

        int result = 0;
        for(int i=1;i<=n;i++){
           result = Math.max(result,search(i));
        }

        System.out.println(result);
        br.close();
    }

    static int search(int start){

        int result = 0;
        boolean[] visit = new boolean[n+1];
        int[] dis = new int[n+1];
        for(int i=1;i<=n;i++){
            if(i == start)
                continue;

            dis[i] = Integer.MAX_VALUE;
        }

        PriorityQueue<Node> pq = new PriorityQueue<>(
                (x,y) -> x.c - y.c
        );

        pq.add(new Node(start,0));


        while(!pq.isEmpty()){
            Node cur = pq.poll();

            if(visit[cur.v])
                continue;

            visit[cur.v] = true;

            for(Node next : graph[cur.v]){
                if(dis[next.v] > dis[cur.v] + next.c){
                    dis[next.v] = dis[cur.v] + next.c;
                    pq.add(new Node(next.v,dis[next.v]));
                }
            }
        }

        for(int i=1;i<=n;i++){
            if(dis[i] <= m)
                result += item[i];
        }

        return result;
    }
}
class Node{
    int v;
    int c;

    Node(int v,int c){
        this.v = v;
        this.c = c;
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 3184 (양) - java  (0) 2023.08.29
백준 11403 (경로 찾기) - java  (1) 2023.08.29
백준 7490 (0 만들기) - java  (0) 2023.08.22
백준 1766 (문제집) - java  (0) 2023.08.18
백준 2252 (줄 세우기) - java  (0) 2023.08.18