문제 링크
https://www.acmicpc.net/problem/1884
문제
봄캠프 기간 동안 고속도로의 통행료가 급격하게 올라, 참가자들이 자칫 집으로 돌아가지 못할 수도 있는 위기에 봉착했다! 통행료가 인하되기 전까지는 여기 속초에서 원쌤과 함께 계속 프로그래밍 공부를 해야 할 수도 있는 상황인 것이다! 이 모든 것은 귀가시에 사용할 교통비를, 고속도로 통행료가 오르기 전에 계산해서 들고 왔기 때문이다.
다급해진 여러분은 정해진 예산을 가지고 집으로 돌아갈 수 있을지 알아보고, 갈 수 있다면 그에 필요한 최단 이동거리를 계산하려고 한다. 이를 해결하기 위한 프로그램을 작성하라.
입력
첫 줄에 여러분이 준비해 둔 교통비 K가 주어진다. (0≤K≤10,000) 둘째 줄과 셋째 줄에는 각각 도시의 숫자 N과 도로의 숫자 R이 주어진다. (2≤N≤100, 1≤R≤10,000) 이후 R개의 줄에 각 도로의 정보가 주어지는데, 각 줄은 네 개의 숫자 s, d, l, t로 이루어져 있다. s는 도로의 출발 도시 번호이고, d는 도로의 도착 도시 번호이다. l은 도로의 길이이고, t는 도로의 통행료이다. (1≤s≤N, 1≤d≤N, 1≤l≤100, 0≤t≤100)
도시의 번호는 1번부터 N번까지 빠짐없이 붙어 있다. 이곳 속초는 1번 도시이고, 여러분의 집은 N번 도시에 있다. 각 도로는 일방통행로이다. 서로 다른 두 도로가 서로 같은 시작 도시와 서로 같은 도착 도시를 가질 수 있음에 유의하라.
출력
첫 줄에 정해진 예산 내에서 이용할 수 있는 경로 중 제일 짧은 것의 길이를 출력한다. 만약 가능한 경로가 없을 때에는 -1을 출력한다.
예제 입력 1
5
6
7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2
예제 출력 1
11
예제 입력 2
0
4
4
1 4 5 2
1 2 1 0
2 3 1 1
3 4 1 0
예제 출력 2
-1
알고리즘 분류
- 최단 거리 알고리즘
풀이
A에 도착해서 남은 교통비가 B일 때의 최단 거리를 기록하는 Cost[A][B] 2차원 배열을 선언해서 1번 정점을 시작점으로 잡고 다익스트라를 1번 수행해준다. 그리고 교통비가 0~K일 때 최단 거리의 최솟값을 구해준다.
그냥 골드2 다익스트라 문제들이랑 비슷해 보이는데 왜 골드1인지는 모르겠다.(근데 단방향인 거를 양방향 도로인 줄 알고 계속 틀렸다)
코드
#include <iostream>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <climits>
#define FASTIO cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define MAX_N 101
#define MAX_K 10001
#define LL long long
#define INF 1e9
using namespace std;
struct INFO {
int Dest, Dist, Cost;
};
struct COMP {
bool operator()(INFO A, INFO B) {
return (A.Dist > B.Dist);
}
};
int K, N, R;
vector<INFO> Edge[MAX_N];
int Cost[MAX_N][MAX_K];
int answer = INF;
void Input() {
cin >> K;
cin >> N;
cin >> R;
for (int i = 2; i <= N; i++) {
for (int j = 0; j <= K; j++) {
Cost[i][j] = INF;
}
}
for (int i = 0; i < R; i++) {
int S, D, L, T;
cin >> S >> D >> L >> T;
Edge[S].push_back({ D,L,T });
}
}
void Dijkstra() {
priority_queue<INFO, vector<INFO>, COMP> PQ;
PQ.push({ 1,0,K });
while (!PQ.empty()) {
int CurD = PQ.top().Dist;
int CurC = PQ.top().Cost;
int CurX = PQ.top().Dest;
PQ.pop();
if (Cost[CurX][CurC] < CurD) {
continue;
}
for (int i = 0; i < Edge[CurX].size(); i++) {
int nextD = Edge[CurX][i].Dist;
int nextC = Edge[CurX][i].Cost;
int nextX = Edge[CurX][i].Dest;
if (CurC < nextC) {
continue;
}
if (Cost[nextX][CurC - nextC] > CurD + nextD) {
Cost[nextX][CurC - nextC] = CurD + nextD;
PQ.push({ nextX, Cost[nextX][CurC - nextC], CurC - nextC });
}
}
};
}
void Find_Answer() {
for (int i = 0; i <= K; i++) {
answer = min(answer, Cost[N][i]);
}
if (answer == INF) {
cout << -1 << "\n";
}
else {
cout << answer << "\n";
}
}
int main() {
FASTIO
Input();
Dijkstra();
Find_Answer();
return 0;
}
'BOJ > Gold' 카테고리의 다른 글
[BOJ/Gold 1] 백준 11781 퇴근 시간(C++) (0) | 2022.02.27 |
---|---|
[BOJ/Gold 1] 백준 10776 제국(C++) (0) | 2022.02.27 |
[BOJ/Gold 1] 백준 1800 인터넷 설치(C++) (0) | 2022.02.27 |
[BOJ/Gold 2] 백준 23033 집에 빨리 가고 싶어!(C++) (0) | 2022.02.26 |
[BOJ/Gold 2] 백준 19701 소 운전한다.(C++) (0) | 2022.02.26 |