본문 바로가기
ps

[백준] 24042 - 횡단보도

by kariskan 2022. 12. 29.

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

 

24042번: 횡단보도

당신은 집으로 가는 도중 복잡한 교차로를 만났다! 이 교차로에는 사람이 지나갈 수 있는 $N$ 개의 지역이 있고 그 지역 사이를 잇는 몇 개의 횡단보도가 있다. 모든 지역은 횡단보도를 통해 직,

www.acmicpc.net

 

골드 1까지 되는 문제인지는 잘 모르겠다.

이 문제는 다익스트라로 해결할 수 있는데, 가중치가 동적으로 변경된다.

즉, 주기에 맞지 않게 정점을 방문하면 다음 주기(+m)에 다음 정점을 방문할 수 있다는 뜻이다.

 

  1. 그래서 현재 주기에 갈 수 있는지 없는지를 판단한 후에 -> ((i.second - cost) % m + m) % m
  2. 이동하는 시간을 더하면 된다 -> + 1

1. 에서 식을 저렇게 짠 이유는, 언어마다 나머지 연산을 다른 방식으로 해결하기 때문이다.

그래서 많은 WA를 받았고 결국 저렇게 계산하였다. 즉, (i.second - cost) % m < 0 이어도 올바르게 결과가 도출된다.

 

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

vector<vector<pair<int, long long>>> v;
vector<long long> dis;
int main()
{
	int n, m;
	cin >> n >> m;
	v.resize(n + 1);
	dis.resize(n + 1, LLONG_MAX);

	for (int i = 0; i < m; i++)
	{
		int a, b;
		cin >> a >> b;
		v[a].push_back({b, i});
		v[b].push_back({a, i});
	}

	priority_queue<pair<long long, int>> pq;
	pq.push({0, 1});
	dis[1] = 0;

	while (!pq.empty())
	{
		long long cost = -pq.top().first;
		int node = pq.top().second;
		pq.pop();

		for (auto &i : v[node])
		{
			int nxNode = i.first;
			long long nxCost = cost + ((i.second - cost) % m + m) % m + 1;

			if (dis[nxNode] > nxCost)
			{
				dis[nxNode] = nxCost;
				pq.push({-nxCost, nxNode});
			}
		}
	}

	cout << dis[n];
}

'ps' 카테고리의 다른 글

[백준] 24337 - 가희와 탑  (2) 2022.12.31
[백준] 1943 - 동전 분배  (0) 2022.12.29
[백준] 22954 - 그래프 트리 분할  (0) 2022.12.28
[백준] 13144 - List of Unique Numbers  (0) 2022.12.28
[백준] 22866 - 탑 보기  (1) 2022.12.05

댓글