https://www.acmicpc.net/problem/24042
24042번: 횡단보도
당신은 집으로 가는 도중 복잡한 교차로를 만났다! 이 교차로에는 사람이 지나갈 수 있는 $N$ 개의 지역이 있고 그 지역 사이를 잇는 몇 개의 횡단보도가 있다. 모든 지역은 횡단보도를 통해 직,
www.acmicpc.net
골드 1까지 되는 문제인지는 잘 모르겠다.
이 문제는 다익스트라로 해결할 수 있는데, 가중치가 동적으로 변경된다.
즉, 주기에 맞지 않게 정점을 방문하면 다음 주기(+m)에 다음 정점을 방문할 수 있다는 뜻이다.
- 그래서 현재 주기에 갈 수 있는지 없는지를 판단한 후에 -> ((i.second - cost) % m + m) % m
- 이동하는 시간을 더하면 된다 -> + 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 |
댓글