문제 풀이/C#

[11404] - 플로이드

Chamber 2022. 11. 19. 16:57

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

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

플로이드 워셜 알고리즘

모든 정점에서 다른 정점까지의 최단거리

- 다익스트라는 한(시작) 정점에서 다른 모든 정점까지의 최단 거리

 

문제 풀이

  • 배열 생성 - 인덱스가 [시작, 도착] = 가중치
  • 문제의 정점 개수가 100개, 가중치가 최대 100000이니 inf 는 10000000으로 설정
  • 자기 자신을 탐색하는 경우는 거리(가중치)가 0이니 아닌 경우만 inf로 설정
  • 입력에 '시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다.' 라고 써있으니 입력을 받을 때 중복된 노선이 나오면 최소값으로 설정.
  • 거치는 곳, 시작, 도착 순으로 3중 반복문을 만들어 시작 → 거침 + 거침 → 도착과 시작 → 도착을 비교하여 최소값 넣어주기.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Baekjoon.Gold
{
    internal class _11404
    {
        const int inf = 10000000;

        static void Main(string[] args)
        {
            StringBuilder stb = new StringBuilder();
            int n = int.Parse(Console.ReadLine());
            int m = int.Parse(Console.ReadLine());
            //arr[시작, 도착] = 가중치
            int[,] arr = new int[n + 1, n + 1];

            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= n; j++)
                {
                    //자기 자신은 0, 나머지는 inf로
                    if (i != j)
                        arr[i, j] = inf;
                }
            }

            for (int i = 0; i < m; i++)
            {
                int[] input = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                //중복되면 최소값으로
                arr[input[0], input[1]] = Math.Min(arr[input[0], input[1]], input[2]);
            }

            //플로이드 워셜
            for (int i = 1; i <= n; i++) //거치는 노드
            {
                for (int j = 1; j <= n; j++) // 시작 노드
                {
                    if (i == j)
                        continue;

                    for (int k = 1; k <= n; k++) // 끝 노드
                        arr[j, k] = Math.Min(arr[j, i] + arr[i, k], arr[j, k]);
                }
            }

            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= n; j++)
                {
                    if (arr[i, j] == inf || i == j)
                        stb.Append("0 ");
                    else
                        stb.Append(arr[i, j].ToString()+" ");
                }
                stb.AppendLine();
            }

            Console.WriteLine(stb);
        }
    }
}