Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

승형님의 블로그

백준 11562번, 백양로 브레이크 본문

Problem Solving/백준

백준 11562번, 백양로 브레이크

승형 2022. 11. 25. 10:18

 

 

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;
}

 

Comments