본문 바로가기

c++/Baekjoon Online

백준 1507 : 궁금한 민호 C++

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

 

1507번: 궁금한 민호

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 각각의 도시 사이에 이동하는데 필요한 시간 (≤ 10,000)이 주어진다. A에서 B로 가는 시간과 B에서 A로 가는 시간은 같다.

www.acmicpc.net

 

※ 플로이드 와샬 활용 간단 정리

-> 모든 노드끼리의 가능한 최단거리를 구하는 것임.

 

1) 현재 노드들 사이에 연결된 다리들을 이용해 노드간 거리 초기화

 

2) 기본적으로 노드를 3개 찝어서 활용

시작노드, 도착노드, 거쳐갈 노드

 

3) min( 시작노드 -> 도착노드, 시작노드 ->거쳐갈 노드 + 거쳐갈노드 -> 도착노드)

 

풀이

1. 이놈은 이미 플로이드 와샬이  적용되어 있다

-> 우리가 구해야될건 이놈들의 다리갯수를 최소화 할 수 있는지??

 

2. 현재 주어진거 말고 다른 최단경로가 있으면 잘못된거니 -1 출력

 

3. 다른곳으로 돌아가는거랑 지금 최단 거리랑 똑같으면 직접 연결된 다리는 불필요

 

 

#include <iostream>
using namespace std;

int n;
int input_arr[21][21];
int answer_arr[21][21];
// 만약 출발지 -> 목적지 현재 최단길이기
// 다른데를 거쳐가는데보다 느리다?
// 직접 연결된 다리가 없고 돌아가는 길이 최단이라는겨

int main()
{
	int sum = 0;
	cin >> n;
	for(int i=0;i<n;i++)
		for (int j = 0; j < n; j++)
		{
			cin >> input_arr[i][j];
			answer_arr[i][j] = input_arr[i][j];
		}

	//a 중간
	// b 시작 c 도착
	for (int a = 0; a < n; a++)
	{
		for (int b = 0; b < n; b++)
		{
			for (int c = 0; c < n; c++)
			{
				if ((b == a) || (c == a))
					continue;
				if (input_arr[b][c] > input_arr[b][a] + input_arr[a][c])
				{
					cout << -1 << endl;
					return 0;
				}

				if (input_arr[b][c] == input_arr[b][a] + input_arr[a][c])
					answer_arr[b][c] = 0;

			}
		}
	}
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
		{
			sum += answer_arr[i][j];
		}

	cout << sum / 2 << endl;

	return 0;
}

'c++ > Baekjoon Online' 카테고리의 다른 글

백준 1461 : 도서관 C++  (0) 2021.06.27
백준 8980 : 택배 C++  (0) 2021.06.27
백준 1946 : 신입사원 C++  (0) 2021.06.26
백준 1700 : 멀티탭 스케줄링 C++  (0) 2021.06.24
백준 2579 : 계단 오르기 C++  (0) 2020.11.20