본문 바로가기
백준(C언어)/23년 8월

[C] 백준 - 11404번: 플로이드

by C0MPAS 2023. 8. 31.

9월 1일(금) - 그래프와 순회 (11404번)

 

11404번: 플로이드

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

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

최초 생각 정리

 

- 플로이드 알고리즘은 이전에 풀이했던 "11403번: 경로 찾기" 문제에서 처음 활용해보았다

- 당시에는 플로이드 알고리즘인줄 모르고 풀이했지만, 이번 문제는 바로 활용해아하기에 아래 풀이를 참고

 

Floyd-Warshall(플로이드 와샬) 알고리즘

Floyd-Warshall(플로이드 와샬) 알고리즘 Floyd-Warshall Algorithm - 그래프에서 모든 정점 사이의 최단 거리를 구하기 위한 알고리즘- 다익스트라 알고리즘을 모든 정점에서 수행한 것과 같은 알고리즘이

dongdd.tistory.com

 

- 입력은 도시의 개수 n과 버스의 개수 m을 입력받고,

   m개의 줄에서 a(시작 도시), b(도착 도시), c(비용)를 입력받는다

- 풀이과정은

  1) 2중 for문으로 ( i != j )인 경우에만 INF로 초기화해주고,

  2) a,b,c가 입력되면 arr[ a ][ b ]와 c 중에서 더 작은 값을 arr[ i ][ j ]에 넣어주고,

  3) 플로이드 와샬 알고리즘 수행한다

- 출력은 n X n 개의 최소비용을 2중 for문을 사용해서

  arr[ i ][ j ]값이 INF와 다른 경우에만 arr[ i ][ j ]값을 출력하고,

  arr[ i ][ j ]값이 INF와 같다면 0을 출력한다

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

#include <stdio.h>
#define INF 987654321

int n, m;
int arr[101][101];

int MIN(int x, int y)
{
	return ((x < y) ? (x) : (y));
}

void floyd_warshell()
{
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			for (int k = 1; k <= n; k++)
			{
				if (arr[j][i] != INF && arr[i][k] != INF)
				{
					arr[j][k] = MIN(arr[j][k], arr[j][i] + arr[i][k]);
				}
			}
		}
	}
}

int main(void)
{
	scanf("%d", &n);
	scanf("%d", &m);

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (i != j)
			{
				arr[i][j] = INF;
			}
		}
	}

	int a, b, c;
	for (int i = 0; i < m; i++)
	{
		scanf("%d %d %d", &a, &b, &c);
		arr[a][b] = MIN(arr[a][b], c);
	}

	floyd_warshell();
	
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			int result = (arr[i][j] != INF) ? arr[i][j] : 0;
			printf("%d ", result);
		}
		printf("\n");
	}

	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

'백준(C언어) > 23년 8월' 카테고리의 다른 글

[C] 백준 - 1068번: 트리  (0) 2023.08.31
[C] 백준 - 1449번: 수리공 항승  (0) 2023.08.30
[C] 백준 - 11279번: 최대 힙  (0) 2023.08.29
[C] 백준 - 2565번: 전깃줄  (0) 2023.08.28
[C] 백준 - 2583번: 영역 구하기  (0) 2023.08.25

댓글