https://www.acmicpc.net/problem/24042
24042번: 횡단보도
당신은 집으로 가는 도중 복잡한 교차로를 만났다! 이 교차로에는 사람이 지나갈 수 있는 $N$ 개의 지역이 있고 그 지역 사이를 잇는 몇 개의 횡단보도가 있다. 모든 지역은 횡단보도를 통해 직,
www.acmicpc.net
생각해보기
- 단순히 1에서 N으로 가는 다익스트라다.
- 헌데 비용을 구하는 방식이 조금 이상하다...?
- 현재 비용이 입력된 i(불이 켜지는 최소 값)보다 작을 수도 있다.
- 비용이 int 범위를 벗어날 수 있다.
- ceil을 쓰면 좋지만 최대값이 long long이기에 제대로 동작하지 못해 함수를 만들어 줘야 한다.
코드
#include<iostream>
#include<queue>
#include<functional>
using namespace std;
typedef pair<int, int> pii;
typedef pair<long long, int> pli;
int N;
long long M;
vector<pii> ways[100001];
long long dp[100001];
struct compare{
bool operator()(pli &a, pli &b){
if(a.first == b.first)
a.second > b.second;
return a.first > b.first;
}
};
void input(){
int a,b;
cin>>N>>M;
for(int i=0;i<M;++i){
cin>>a>>b;
ways[a].push_back({b,i});
ways[b].push_back({a,i});
}
}
long long calc(long long cost, int ni){
if(cost < ni)
return ni + 1;
else if((cost - ni) % M == 0)
return (cost - ni)/M*M + ni + 1;
else
return ((cost - ni)/M + 1)*M + ni + 1;
}
long long bfs(){
priority_queue<pli, vector<pli>, compare> pq;
pq.push({0,1});
dp[1] = 0;
while(!pq.empty()){
long long cost = pq.top().first;
int node = pq.top().second;
pq.pop();
if(node == N)
return cost;
if(dp[node] < cost)
continue;
for(int i=0;i<ways[node].size();++i){
int next = ways[node][i].first;
int ni = ways[node][i].second;
long long ncost = calc(cost, ni);
if(dp[next] <= ncost)
continue;
dp[next] = ncost;
pq.push({ncost, next});
}
}
return -1;
}
void solution(){
fill(&dp[0], &dp[100001], 123'456'123'456'123'456);
cout<<bfs()<<'\n';
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
solution();
return 0;
}

728x90
'알고리즘 > 백준 문제' 카테고리의 다른 글
| 14658 - 하늘에서 별똥별이 빗발친다 (0) | 2023.07.20 |
|---|---|
| 1138 - 한 줄로 서기 (0) | 2023.07.19 |
| 1522 - 문자열 교환 (0) | 2023.07.18 |
| 1911 - 흙길 보수하기 (0) | 2023.07.18 |
| 2098 - 외판원 순회 (0) | 2023.07.18 |
댓글