문제
https://www.acmicpc.net/problem/1389
풀이
[플로이드 와샬 알고리즘]
https://yun000.tistory.com/155
플로이드 와샬 알고리즘(Floyd Warshall)
플로이드 와샬 알고리즘모든 정점에서 모든 정점으로의 최단 경로다이나믹 프로그래밍 사용 시간복잡도 O(N^3)+) 다익스트라 알고리즘과 달리 음의 간선도 사용 가능 탐색 1) 시작연결되지 않
yun000.tistory.com
예시)
입력
5 5
1 3
1 4
4 5
4 3
3 2
1. CHECK - Floyd Warshall Algorithm
플로이드 와샬 알고리즘을 사용하여 왼쪽 그래프가 오른쪽 그래프로 변경된다.
2. CHECK - min
모든 경로에서 모든 경로까지의 최단 거리를 구했으니 이제 각각을 더해가며
최소인 값을 출력하면된다.
코드
#include <iostream>
#include <vector>
#define INF 2147483647
using namespace std;
int main() {
//INPUT
int N, M;
cin >> N >> M;
vector<vector<int>>graph(N+1,vector<int>(N+1,INF));
for (int i = 1; i <= N; i++) {
graph[i][i] = 0; // 자기 자신은 0
}
int p1, p2;
for (int i = 0; i < M; i++) {
cin >> p1 >> p2;
graph[p1][p2] = 1;
graph[p2][p1] = 1;
}
//CHECK - Floyd Warshall Algorithm
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (graph[i][k] == INF || graph[k][j] == INF) continue;
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
}
//CHECK - min
int min = INF;
int result = 0;
for (int i = 1; i <= N; i++) {
int sum = 0;
for (int k = 1; k <= N; k++) {
sum += graph[i][k];
}
if (sum < min) { min = sum; result = i; }
}
//RESULT
cout << result;
}
'개발 > 백준' 카테고리의 다른 글
[백준] 15652. N과 M (4) (0) | 2025.09.07 |
---|---|
[백준] 15650. N과 M (2) (0) | 2025.09.07 |
[백준] 30804. 과일 탕후루 (C++) (0) | 2025.07.06 |
[백준] 2630. 색종이 만들기 (C++) (0) | 2025.06.30 |
[백준] 2448번. 별 찍기-11 (C++) (0) | 2025.02.27 |