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

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

접근 방법

시작점과 일정한 종점이 주어졌으므로 다익스트라 알고리즘을 사용하였다. 학생마다 집 → 종점 + 종점→ 집의 거리를 구해 가장 오래 걸리는 것이 답.

 

문제 풀이

  • 다익스트라를 사용하기위해 리스트로 그래프 만들기
  • 우선순위 큐로 (탐색 지점, 가중치)를 넣고, 그래프 내의 현재 탐색 지점에서 갈 수 있는 곳의 가중치를 비교 후, 최솟값으로 다시 큐에 넣어주기
  • 1번 학생부터 N번 학생까지 반복문으로 다익스트라를 사용하여 집 → X, X → 집의 거리를 구한 뒤 합, 학생중 최대값을 ans 에 저장
  • ans 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.Gold
{
    class _1238
    {
        static List<(int, int)>[] graph;
        static int v;

        static void Main(string[] args)
        {
            int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            v = n[0];
            int x = n[2];

            graph = new List<(int, int)>[v + 1];
            for (int i = 1; i <= v; i++)
                graph[i] = new List<(int, int)>();

            for (int i = 0; i < n[1]; i++)
            {
                int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                graph[arr[0]].Add((arr[1], arr[2]));
            }


            int ans = 0;
            for(int i = 1; i<= v; i++)
            {
                int go = dijkstra(i, x);
                int back = dijkstra(x, i);

                ans = Math.Max(ans, go + back);
            }

            Console.WriteLine(ans);

        }

        static int dijkstra(int start, int end)
        {
            bool[] visited = new bool[v + 1];

            int[] distance = Enumerable.Repeat(1000001, v + 1).ToArray();
            PriorityQueue<int, int> pq = new PriorityQueue<int, int>();
            pq.Enqueue(start, 0);
            distance[start] = 0;

            while (pq.Count > 0)
            {
                int point = pq.Dequeue();

                if (!visited[point])
                {
                    visited[point] = true;

                    foreach ((int, int) next in graph[point])
                    {
                        distance[next.Item1] = Math.Min(distance[next.Item1], distance[point] + next.Item2);
                        pq.Enqueue(next.Item1, distance[next.Item1]);
                    }
                }
            }

            return distance[end];
        }
    }
}

'문제 풀이 > C#' 카테고리의 다른 글

[23796] - 2,147,483,648 게임  (0) 2022.11.28
[1916] - 최소비용 구하기  (0) 2022.11.26
[1956] - 운동  (0) 2022.11.23
[17300] - 패턴  (0) 2022.11.22
[22867] - 종점  (0) 2022.11.21

+ Recent posts