백준/그래프

[백준 11404번 / C++ / 플로이드-와샬] 플로이드

배발자 2022. 3. 16.
반응형

이 문제는 플로이드 와샬 알고리즘을 활용해서 풀면 된다. 

플로이드 와샬 알고리즘을 모르는 분은 아래 링크에 들어가서 개념을 보고 오길 권한다. 

 

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

지난 시간에는 다익스트라(Dijkstra) 알고리즘에 대해 학습했습니다. 다익스트라 알고리즘은 하나의 정점...

blog.naver.com


#접근방법

 

  1. info 이차원 배열에 큰 수로 모두 초기화 한다. 
  2. 도시 a에서 a로 가는 정보는 0으로 초기화 한다. 
  3. 도시 a에서 도시 b로 가는 비용을 info[a][b]에 담는다. 
  4. 도시 a에서 도시 b로 가는 비용과 도시 a에서 도시 k를 거쳤다가 도시 b로 가는 비용을 비교해서 작은값을 info[a][b]에 담는다.
  5. 출력

 

 

#include <iostream>
#include <algorithm>
using namespace std; 
int info[101][101];

int main() {
	ios::sync_with_stdio(0); 
	cin.tie(0); 
	cout.tie(0); 

	int n; cin >> n; 
	int m;  cin >> m; 

	fill(info[0], info[101], 987654321); 

	for (int i = 1; i <= n; i++) {
		info[i][i] = 0; 
	}

	for (int i = 0; i < m; i++) {
		int from, to, cost; 
		cin >> from >> to >> cost; 
		info[from][to] =min(info[from][to], cost); 
	}

	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				info[i][j] = min(info[i][j], info[i][k] + info[k][j]);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (info[i][j] == 987654321) cout << "0 "; 
			else cout << info[i][j] << " ";
		}cout << "\n";
	}

	return 0; 
	
}

 

 

11404번: 플로이드

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

www.acmicpc.net

반응형

댓글