728x90
🅰️문제주소 : https://www.acmicpc.net/problem/11404
🚩문제

🪡풀이
- 그래프에서 최단거리를 구할때는 플로이드-워셜 알고리즘을 사용한다
- 시간복잡도가 O(V^3)이므로 노드 개수를 확인하여 해당 알고리즘을 요구하는 문제가 맞는지 확인해본다
- 충분히 큰 수로 초기화 할 때 MAX값을 사용하지 않도록 주의한다 (별도로 MAX값을 체크하지 않으면 중간 경로 거리 합산을 구할 때 최대값을 초과하여 음수가 되어버릴 수 있다)
- 노드의 개수가 정해져있고 크지 않으므로 굳이 vector보다는 이차원배열이 속도가 빠르다
☕코드는 아래 숨김
더보기
#include <iostream>
#include <vector>
#include <limits.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N, M;
vector<vector<int64_t>> map;
cin >> N;
cin >> M;
map.resize(N+1, vector<int64_t>(N+1));
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
if (i == j)
map[i][j] = 0;
else
map[i][j] = 10000001;
}
}
for (int i = 0; i < M; ++i)
{
int start, end, cost;
cin >> start >> end >> cost;
if(map[start][end] > cost)
map[start][end] = cost;
}
for (int k = 1; k <= N; ++k)
{
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
}
}
}
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
if (map[i][j] == 10000001)
cout << "0";
else
cout << map[i][j];
if (N != j)
cout << " ";
}
if (N != i)
cout << "\n";
}
return 0;
}
💡알게 된 것
- 플로이드-워셜 알고리즘
- 초기화시 최대값이 아닌 충분히 큰 값으로 최초기화 하기
- 백준에서 출력초과시 단순 출력 문제가 아니라 주로 답을 틀렸기에 출력내용을 초과할 가능성이 높다
- 다른 그래프 문제와 동일하게 인덱스 1번부터 써야 편하다
728x90
'운동하는 개발자 > 알고리즘, 코딩테스트' 카테고리의 다른 글
| Beakjoon] 최소 스패닝 트리 (백준 1197 코테) - 그래프 (C++) (최소 신장 트리) (0) | 2025.11.09 |
|---|---|
| Beakjoon] 줄 세우기(백준 11657 코테) - 그래프 (C++) (벨만-포드) (0) | 2025.10.09 |
| Beakjoon] 줄 세우기(백준 1753 코테) - 그래프 (C++) (다익스트라) (0) | 2025.09.27 |
| Beakjoon] 줄 세우기(백준 2252코테) - 그래프 (C++) (0) | 2024.04.14 |
| Beakjoon] 여행 가자(백준 1976코테) - 그래프 (C++) (0) | 2024.02.19 |