Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 31
Archives
Today
Total
관리 메뉴

승형님의 블로그

백준 17833번, 홍익대학교 지하캠퍼스 본문

Problem Solving/백준

백준 17833번, 홍익대학교 지하캠퍼스

승형 2022. 11. 24. 14:31

 

https://www.acmicpc.net/problem/17833

 

17833번: 홍익대학교 지하캠퍼스

홍익대학교 서울 캠퍼스의 건물들은 정문부터 후문까지 연결되어 있지만 건물마다 연결되어 있는 층이 제각각이다. 예를 들어 정문인 R동의 3층으로 나오면 K동의 1층이 있고, L동의 8층으로 나

www.acmicpc.net

요약

 

지하 R층에서 지하 D층으로 이어지는 캠퍼스 모델을 설계한다.


1. 시작 지점 지하 R층과 도착지점 지하 D층이 주어지고, 사용할 수 있는 건물 모델들이 주어진다. 이때, 모델이 최종적으로 위치한 범위가 지하 1층부터 지하 N층을 만족한다면 자유롭게 건물을 배치할 수 있다.

 

2. 모델을 제작하는데 T의 시간이 걸리고, 건물을 좌우로 반전시켜 배치할 수 있으므로, 가중치가 T인 양방향 간선으로 생각할 수 있다. 건물을 범위 내에서 자유롭게 배치할 수 있으므로, 각 간선이 연결하는 두 정점은 $(E_{1} + j, E_{2} + j)   (0\leq j\leq N-H)$이다.

 

3. 위 그래프에서 다익스트라를 통해 정점 R에서 정점 D로 향하는 최단경로를 구한다. 

 

#include <bits/stdc++.h>
using namespace std;
typedef pair<long, int> pli;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;

struct cmp {
	bool operator() (pli A, pli B) {
		return A.first > B.first;
	}
};

int N, R, D, M;
vector <pli> graph[2001];
long long dist[2001];

void Dijkstra(int start);

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> N >> R >> D >> M;
	for (int i = 0; i < M; i++) {
		int H, E1, E2;
		long long T;
		cin >> H >> T >> E1 >> E2;
		for (int j = 0; j <= N - H; j++) {
			graph[E1 + j].push_back({ T, E2 + j });
			graph[E2 + j].push_back({ T, E1 + j });
		}
	}
	Dijkstra(R);
	if (dist[D] == INF) cout << -1;
	else cout << dist[D];
	return 0;
}

void Dijkstra(int start) {
	for (int i = 1; i <= N; i++) dist[i] = INF;
	priority_queue <pli, vector<pli>, cmp> pq;
	dist[start] = 0;
	pq.push({ 0, start });
	while (pq.size()) {
		int now = pq.top().second;
		long long val = pq.top().first;
		pq.pop();
		if (dist[now] < val) continue;
		for (int i = 0; i < graph[now].size(); i++) {
			int next = graph[now][i].second;
			long long new_val = val + graph[now][i].first;
			if (dist[next] > new_val) {
				dist[next] = new_val;
				pq.push({ new_val, next });
			}
		}
	}
}

 

Comments