승형님의 블로그
백준 11562번, 백양로 브레이크 본문
https://www.acmicpc.net/problem/11562
11562번: 백양로 브레이크
서울 소재 Y모 대학교에서 대규모 공사를 진행하면서, 학교가 마치 미로처럼 변해버리고 말았다. 공사 이전까지는 어떤 건물에서 출발하더라도 다른 모든 건물로 갈 수 있는 길이 있었으나, 공
www.acmicpc.net
요약
임의의 두 정점간의 최단거리를 묻는 K개의 쿼리를 처리한다.
1. 초기의 학교의 상태가 주어진다. 이때, 일방통행 도로를 1번의 조작을 통해 양방향 도로로 바꿀 수 있다. 따라서, 양방향 도로의 경우에는 가중치가 0이고 일방통행 도로인 경우에는 순방향일때 가중치가 0, 역방향일때 가중치가 1인 가중치 방향 그래프로 바꾸어 생각할 수 있다.
2. 임의의 정점 S와 E간의 최단거리를 묻는 K개의 쿼리를 처리해야 하고, 정점의 개수가 최대 250이므로 플로이드-워셜(Floyd-Warshall) 알고리즘을 통해 $O(N^{3})$으로 전처리 후, 쿼리마다 $O(1)$로 처리할 수 있다.
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int N, M, K;
int graph[251][251];
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
memset(graph, INF, sizeof(graph));
for (int i = 1; i <= N; i++) graph[i][i] = 0;
for (int i = 0; i < M; i++) {
int U, V, B;
cin >> U >> V >> B;
graph[U][V] = 0;
graph[V][U] = 0;
if (B == 0) graph[V][U] = 1;
}
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
}
}
cin >> K;
for (int i = 0; i < K; i++) {
int S, E;
cin >> S >> E;
cout << graph[S][E] << '\n';
}
return 0;
}
'Problem Solving > 백준' 카테고리의 다른 글
백준 16562, 친구비 (0) | 2022.12.20 |
---|---|
백준 1854번, K번째 최단경로 찾기 (0) | 2022.11.25 |
백준 2307번, 도로검문 (0) | 2022.11.25 |
백준 1162번, 도로포장 / Revamping Trails (0) | 2022.11.25 |
백준 5719번, 거의 최단 경로 / Almost Shortest Path (0) | 2022.11.24 |
Comments