득이공간

[백준 C++] 11403 경로 찾기 - 플로이드워셜 본문

PS/알고리즘 문제풀이

[백준 C++] 11403 경로 찾기 - 플로이드워셜

쟁득 2024. 2. 2. 16:56
 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 길이가 양수인 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net

cpp
#include <iostream> #include <vector> using namespace std; vector<vector<int>> Distance; void FloydWarshall(int N) { for (int K = 0; K < N; ++K) { ‌‌for (int Start = 0; Start < N; ++Start) ‌‌{ ‌‌‌for (int End = 0; End < N; ++End) ‌‌‌{ ‌‌‌‌if (Distance[Start][K] == 0 ‌‌‌‌‌|| Distance[K][End] == 0) ‌‌‌‌{ ‌‌‌‌‌continue; ‌‌‌‌} ‌‌‌‌Distance[Start][End] = 1; ‌‌‌} ‌‌} } } int main() { ‌ios::sync_with_stdio(false); ‌cin.tie(NULL); ‌cout.tie(NULL); int N; ‌cin >> N; ‌Distance.reserve(N); for (int i = 0; i < N; ++i) { ‌‌Distance.emplace_back(vector<int>()); ‌‌for (int j = 0; j < N; ++j) ‌‌{ ‌‌‌int Edge; ‌‌‌cin >> Edge; ‌‌‌Distance.back().emplace_back(Edge); ‌‌} } FloydWarshall(N); for (const vector<int>& Row : Distance) { ‌‌for (const int& Edge : Row) ‌‌{ ‌‌‌cout << Edge << ' '; ‌‌} ‌‌cout << '\n'; } }

일반적인 플로이드-워셜 문제입니다.

점화식 사용 대신 도달 가능한 경우만 판단해서 1값을 넣어주면 됩니다.