본문 바로가기

백준 문제 풀이

백준 11404번 플로이드

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

 

11404번: 플로이드

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

www.acmicpc.net

dire[a][b]는 a번 노드에서 b번 노드로 가는 비용을 담아둔다.

i, j, N을 차례로 반복문에 돌려서 j에서 i를 거쳐 N으로 가는 최단경로를 갱신해준다.

 

#include<iostream>
#include<algorithm>
using namespace std;

int dire[100][100];
//초기에 정점간의 거리들을 초기화 해줄 수
const int INF = 987654321;
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n, m, a, b, c;
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			dire[i][j] = INF;
		}
	}
	for (int i = 0; i < n; i++) {
		dire[i][i] = 0;
	}

	for (int i = 0; i < m; i++) {
		cin >> a >> b >> c;
		a -= 1;
		b -= 1;
		dire[a][b] = min(dire[a][b], c);
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			for (int N = 0; N < n; N++) {
				if (j == N) continue;
                //j에서 i 혹은 i에서 N으로 가는 경로가 없을 때
				if (dire[j][i] == INF || dire[i][N] == INF) continue;
                //최단경로 갱신
				dire[j][N] = min(dire[j][N], dire[j][i] + dire[i][N]);
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
        	//갈 수 없을 때
			if (dire[i][j] == INF) cout << 0 << ' ';
			else cout << dire[i][j] << ' ';
		}
		cout << '\n';
	}

	return 0;
}

'백준 문제 풀이' 카테고리의 다른 글

백준 3015번 오아시스 재결합  (0) 2021.03.16
백준 16894번 약수 게임  (0) 2021.03.16
백준 1967번 트리의 지름  (0) 2021.03.16
백준 9613번 GCD 합  (0) 2021.03.16
백준 13305번 주유소  (0) 2021.03.16