일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 크루스칼
- MST
- 다익스트라
- BFS
- 정렬
- 위상정렬
- 수학
- 좌표압축
- dfs
- 이분탐색
- DisjointSet
- 비트마스크
- boj
- 구현
- 브루트포스
- 세그먼트트리
- 누적합
- 이진탐색
- lca
- 펜윅트리
- 그리디
- LazyPropagation
- 플로이드와샬
- DP
- 이분매칭
- 삼분탐색
- 백준
- 투포인터
- 에라토스테네스의 체
- lis
Archives
- Today
- Total
lastknight00
[백준]지름길(1446) 본문
문제 링크 : [백준]지름길(1446)
문제 설명
고속도로를 D지점까지 이동해야 합니다.
N개의 지름길이 존재하며, 지름길은 Si지점에서 들어가 Ei지점에서 나오게 되고, Di만큼의 거리를 가게 됩니다.
이때, D지점까지가는 최단 이동거리를 구하세요.
입력
N(지름길 갯수, 1 <= N <= 12)
D(도착지점, 0 <= M <= 10,000)
Si Ei Di(시작 지점, 도착 도시, 지름길의 길이, 0 <= Di <= 10,000)
5 150
0 50 10
0 50 20
50 100 10
100 151 10
110 140 90
출력
70
카테고리
#다익스트라
시간 복잡도 상한
O(N2 * D)
해결 방법
- 엣지에 대한 정보가 굉장히 애매해보입니다.
- 모든 지름길간에 도착지점이 출발지점보다 작거나 같은 경우, 엣지 정보들을 만들어주어야 합니다.
- 그래서 우선순위 큐에 정보를 넣을 때, 비용은 [현재까지 오는 비용 + 지름길 비용 + (지름길 시작 지점 - 현재 도착지점)]이 됩니다.
- 시작위치 0, 비용 0에서 시작하여, 3번 작업을 반복하면서 D지점에 도착할 때까지 다익스트라를 돌리면 됩니다.
- 단, 지름길 정보 중 도착지까지 가는 경우가 없을 수 있으니, 지름길 정보에 {출발지점 : D, 도착지점 : D, 비용 0}인 엣지 정보를 강제로 넣어줍니다.
시간복잡도
O(N2 * log(N2))
코드
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int>P;
int n,m,d[13][3],i;
priority_queue<P,vector<P>,greater<P>>q;
int main(){
scanf("%d%d",&n,&m);
for(;i<n;i++)scanf("%d%d%d",d[i],d[i]+1,d[i]+2);
d[n][0]=d[n][1]=m;
q.push({0,0});
while(!q.empty()){
P c=q.top();q.pop();
if(c.second==m){
printf("%d",c.first);
break;
}
for(i=0;i<=n;i++)if(d[i][0]>=c.second)q.push({d[i][2]+d[i][0]-c.second+c.first,d[i][1]});
}
}
'PS' 카테고리의 다른 글
[백준]등산(16681) (0) | 2020.07.18 |
---|---|
[백준]일요일 아침의 데이트(1445) (0) | 2020.07.18 |
[백준]주유소(13308) (0) | 2020.07.18 |
[백준]강의실 배정(11000) (0) | 2020.07.18 |
[백준]비밀 모임(13424) (0) | 2020.07.18 |
Comments