본문 바로가기
ps

[백준] 1507 - 궁금한 민호

by kariskan 2022. 8. 9.

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

 

1507번: 궁금한 민호

강호는 N개의 도시로 이루어진 나라에 살고 있다. 각 도시는 M개의 도로로 연결되어 있으며, 각 도로를 지날 때 필요한 시간이 존재한다. 도로는 잘 연결되어 있기 때문에, 도시 A에서 B로 이동할

www.acmicpc.net

 

최단 경로에 포함된 간선의 합을 구하는 문제이다.

 

맨 처음에 플로이드-와샬 알고리즘을 한 번 돌려본다.

이때 갱신되는 가중치가 생기면 미리 구해놓은 표는 맞지 않으므로 -1을 출력한다.

 

표가 맞다면, 모든 간선을 순회하며 각 간선의 가중치를 0으로 만들고 임시 배열로 플로이드-와샬 알고리즘을 수행한다.

이때 임시 배열의 가중치와 원래 배열의 가중치가 다르면 꼭 필요한 간선이 되므로, 답에 더한다.

 

#include <iostream>
using namespace std;

int n;
int map[20][20];
bool check() {
	int temp[20][20] = { 0, };

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

	for (int k = 0; k < n; k++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {

				if (i == j)continue;
				if (map[i][k] && map[k][j]) {
					if (temp[i][j] == 0 || temp[i][j] > map[i][k] + map[k][j]) {
						temp[i][j] = map[i][k] + map[k][j];
					}
				}
			}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (map[i][j] != temp[i][j])return false;
		}
	}
	return true;
}
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}
	if (check()) {
		int ans = 0;
		for (int i1 = 0; i1 < n; i1++) {
			for (int j1 = i1 + 1; j1 < n; j1++) {
				int num = map[i1][j1];
				int temp[20][20] = { 0, };
				map[i1][j1] = 0;

				for (int k = 0; k < n; k++) {
					for (int i = 0; i < n; i++) {
						for (int j = 0; j < n; j++) {

							if (i == j)continue;
							if (map[i][k] && map[k][j]) {
								if (temp[i][j] == 0 || temp[i][j] > map[i][k] + map[k][j]) {
									temp[i][j] = map[i][k] + map[k][j];
								}
							}
						}
					}
				}
				if (temp[i1][j1] != num) ans += num;
				map[i1][j1] = num;
			}
		}
		cout << ans;
	}
	else cout << -1;
}

'ps' 카테고리의 다른 글

[백준] 1719 - 택배  (0) 2022.08.09
[백준] 2169 - 로봇 조종하기  (0) 2022.08.09
[백준] 1938 - 통나무 옮기기  (0) 2022.08.04
[백준] 2933 - 미네랄  (0) 2022.08.04
[백준] 1949 - 우수 마을  (0) 2022.08.04

댓글