https://www.acmicpc.net/problem/1719
1719번: 택배
명우기업은 2008년부터 택배 사업을 새로이 시작하기로 하였다. 우선 택배 화물을 모아서 처리하는 집하장을 몇 개 마련했지만, 택배 화물이 각 집하장들 사이를 오갈 때 어떤 경로를 거쳐야 하는지 결정하지 못했다. 어떤 경로를 거칠지 정해서, 이를 경로표로 정리하는 것이 여러분이 할 일이다. 예시된 그래프에서 굵게 표시된 1, 2, 3, 4, 5는 집하장을 나타낸다. 정점간의 간선은 두 집하장간에 화물 이동이 가능함을 나타내며, 가중치는 이동에 걸리는 시간
www.acmicpc.net
M대 M으로 최소거리 찾는 방법이여서 플로이드 와샬을 선택했다. 입력받는 지점의 출발점을 지정해 두었다가 최소거리가 갱신되면 갱신된 지점의 출발점으로 현재 출발점을 바꾸는 방식을 택했다.
#include <iostream>
#define INF 100000000;
#define MAX 201
using namespace std;
int n, m; //n은 마을 수, m은 경로수
int a, b, c; //a -> b로 가면 c가 든다.
int d[MAX][MAX]; //플로이드 와샬의 결과를 담는 공간
int start[MAX][MAX]; //시작하는 지점을 담는 공간
//처음에 플로이드 와샬을 실행할 공간을 INF로 초기화, 자신 스스로 들어가는 곳은 0으로 초기화
void setting() {
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
if (i == j) {
d[i][j] = 0;
}
else {
d[i][j] = INF;
}
}
}
}
//프로이드 와샬을 수행하는 함수
void floydwashall() {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (d[i][j] > d[i][k] + d[k][j]) { //현재 비용보다 새로운 비용이 더 크면
d[i][j] = d[i][k] + d[k][j]; //현재 비용을 갱신한다.
start[i][j] = start[i][k]; //출발지점을 바꾼다.
}
}
}
}
}
int main() {
setting(); //플로이드 와샬 공간 초기화
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> a >> b >> c;
d[a][b] = c;
d[b][a] = c;
start[a][b] = b; //시작점 설정
start[b][a] = a; //시작점 설정
}
floydwashall();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
cout << '-' << ' ';
}
else {
cout << start[i][j] << ' ';
}
}
cout << '\n';
}
}
'백준' 카테고리의 다른 글
백준6593 - 상범 빌딩 (0) | 2020.03.04 |
---|---|
백준2665 - 미로만들기 (0) | 2020.03.03 |
백준13023 - ABCDE (0) | 2020.02.28 |
백준1976 - 여행 가자 (0) | 2020.02.26 |
백준1717 - 집합의 표현 (0) | 2020.02.25 |