반응형

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

 

11780번: 플로이드 2

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

www.acmicpc.net

 

플로이드를 이용하여 풀이하였습니다.

 

A에서 B로 가는 최소 비용을 구해주고, 경로 추적을 위해 A와 B사이의 경유 도시를 기억해주었습니다.

void floyd() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			for (int k = 1; k <= n; k++) {
				if (d[j][k] > d[j][i] + d[i][k]) {
					d[j][k] = d[j][i] + d[i][k];
					p[j][k] = i;
				}
			}
		}
	}
}

 

 

경로 추적을 위한 코드는 다음과 같습니다.

void findRoute(int s, int e) {
	if (p[s][e] == 0) return;
	findRoute(s, p[s][e]);
	route.push_back(p[s][e]);
	findRoute(p[s][e], e);
}

void printRoute(int s, int e) {
	... 경로 초기화
	route.push_back(s);
	findRoute(s, e);
	route.push_back(e);
	... 경로 출력
}

기록된 A와 B사이의 도시가 C라면,

A와 C사이의 경유 도시, C와 B사이의 경유 도시를 재귀적으로 탐색하며 전체 경로를 구할 수 있었습니다.

 

 

#include <iostream>
#include <vector>
#include <algorithm>
#define MAX 101
#define INF 1e9
using namespace std;

int n, m, a, b, c;
int d[MAX][MAX];
int p[MAX][MAX];
vector<int> route;

void init() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) d[i][j] = INF;
		d[i][i] = 0;
	}
}

void floyd() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			for (int k = 1; k <= n; k++) {
				if (d[j][k] > d[j][i] + d[i][k]) {
					d[j][k] = d[j][i] + d[i][k];
					p[j][k] = i;
				}
			}
		}
	}
}

void printDist() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cout << (d[i][j] != INF ? d[i][j] : 0) << " ";
		}
		cout << "\n";
	}
}

void findRoute(int s, int e) {
	if (p[s][e] == 0) return;
	findRoute(s, p[s][e]);
	route.push_back(p[s][e]);
	findRoute(p[s][e], e);
}

void printRoute(int s, int e) {
	route.clear();
	route.push_back(s);
	findRoute(s, e);
	route.push_back(e);
	cout << route.size() << " ";
	for (int r : route) cout << r << " ";
	cout << "\n";
}

bool isMovable(int s, int e) {
	return d[s][e] != 0 && d[s][e] != INF;
}

void printRoutes() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (isMovable(i, j)) printRoute(i, j);
			else cout << "0\n";
		}
	}
}

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

	cin >> n >> m;

	init();

	while (m--) {
		cin >> a >> b >> c;
		d[a][b] = min(d[a][b], c);
	}

	floyd();
	printDist();
	printRoutes();
}
반응형

'Algorithm' 카테고리의 다른 글

백준 2629 : 양팔저울  (0) 2021.11.24
백준 1162 : 도로포장  (0) 2021.11.23
백준 16064 : Coolest Ski Route  (0) 2021.11.22
백준 2660 : 회장뽑기  (0) 2021.11.22
백준 2056 : 작업  (0) 2021.11.22

+ Recent posts