백준 21278 c++ : 플로이드 워셜

magicdrill·2025년 5월 5일
0

백준 문제풀이

목록 보기
596/655

백준 21278 c++ : 플로이드 워셜

#include <iostream>
#include <vector>
#include <algorithm>
#define INF 2100000000

using namespace std;

void input_data(int* N, int* M, vector<vector<int>>& road);
void find_answer(int N, int M, vector<vector<int>>& road);
void floyd_warshall(int N, vector<vector<int>>& road);

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

	int N, M;
	vector<vector<int>> road;

	input_data(&N, &M, road);
	find_answer(N, M, road);

	return 0;
}

void input_data(int* N, int* M, vector<vector<int>>& road) {
	int i, A, B;
	
	cin >> *N >> * M;
	road.resize(*N + 1, vector<int>(*N + 1, INF));
	for (i = 0; i <= *N; i++) {
		road[i][i] = 0;
	}

	//양방향 그래프
	for (i = 0; i < *M; i++) {
		cin >> A >> B;
		road[A][B] = 1;
		road[B][A] = 1;
	}

	return;
}

void find_answer(int N, int M, vector<vector<int>>& road) {
	int A = 1, B = 1; // 치킨집을 지을 두 건물 위치
	int min_sum = INF, sum; // 모든 도시의 왕복 시간 총 합
	int i, j, k;

	floyd_warshall(N, road);
	for (i = 1; i <= N; i++) {
		for (j = i + 1; j <= N; j++) {
			sum = 0;
			for (k = 1; k <= N; k++) {
				if (k == i || k == j) {
					continue;
				}
				sum += min(road[k][i], road[k][j]) * 2;
			}

			if (sum < min_sum || (sum == min_sum && (i < A || (i == A && j < B)))) {
				min_sum = sum;
				A = i;
				B = j;
				cout << A << " " << B << " " << min_sum << "\n";
			}
		}
	}

	cout << A << " " <<  B << " " << min_sum << "\n";

	return;
}

void floyd_warshall(int N, vector<vector<int>>& road) {
	int i, j, k;

	cout << "플로이드 워셜 전\n";
	for (i = 0; i <= N; i++) {
		for (j = 0; j <= N; j++) {
			cout << road[i][j] << " ";
		}
		cout << "\n";
	}

	for (k = 1; k <= N; k++) {
		for (i = 1; i <= N; i++) {
			for (j = 1; j <= N; j++) {
				if (road[i][k] < INF && road[k][j] < INF) {
					road[i][j] = min(road[i][j], road[i][k] + road[k][j]);
				}
			}
		}
	}

	cout << "플로이드 워셜 전\n";
	for (i = 0; i <= N; i++) {
		for (j = 0; j <= N; j++) {
			cout << road[i][j] << " ";
		}
		cout << "\n";
	}

	return;
}

0개의 댓글