일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 세그먼트트리
- BFS
- 크루스칼
- 투포인터
- 누적합
- lca
- dfs
- 구현
- 플로이드와샬
- 이분매칭
- 에라토스테네스의 체
- DisjointSet
- MST
- 이분탐색
- 좌표압축
- 수학
- boj
- 펜윅트리
- 비트마스크
- 브루트포스
- 삼분탐색
- 이진탐색
- DP
- 정렬
- LazyPropagation
- 그리디
- 다익스트라
- lis
- 백준
- 위상정렬
Archives
- Today
- Total
lastknight00
[백준]특정한 최단 경로(1504) 본문
문제 링크 : [백준]특정한 최단 경로(1504)
문제 설명
1번 노드에서 N번노드까지 가는데 특정한 두 노드를 거쳐서 가는 최단 거리를 구하세요.
입력
N(노드의 갯수, 1 <= N <= 800)
M(간선의 갯수, 1 <= M <= 200,000)
Ai Bi Ci(간선의 정보)
V1, V2(경유지 노드)
4 6
1 2 3
2 3 3
3 4 1
1 3 5
2 4 5
1 4 4
2 3
출력
7
카테고리
#다익스트라
시간 복잡도 상한
O(NlogN) 혹은 O(MlogM)
해결 방법
- 두 점 사이의 최단거리이므로 다익스트라를 생각해봅니다.
- 그러나 중간의 두 점을 경유해야 합니다.
- 그렇다는 것은 시작점->V1->V2->도착점, 혹은 시작점->V2->V1->도착점 두 가지 중 하나의 경우 일 것입니다.
- 시작점을 기준으로 다익스트라를 돌리게 되면, 시작점에서 V1, V2, 도착점 까지의 최단 거리를 구할 수 있습니다.
- 마찬가지로, V1, V2를 기준으로 돌리면 각 노드를 시작점으로 하여 다른 모든 노드까지의 최단 거리를 구할 수 있습니다.
- 4, 5에서 구한 정보를 가지고, 아래 두 가지 중 최소 비용을 구하면 됩니다.
- (시작점 -> V1) + (V1 -> V2) + (V2 -> 도착점)
- (시작점 -> V2) + (V2 -> V1) + (V1 -> 도착점)
- 단, V1과 V2가 시작점이나 도착점 일 수도 있으니, 그 점만 유의하시면 됩니다.
시간복잡도
O(N+MlogM)
코드
#include<cstdio>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
typedef pair<int,int> p;
int n,m,s[3][801],i,j,x,y,a,b,c,d[3]={1};
vector<p>v[801];
priority_queue<p,vector<p>,greater<p>>q;
int g(int a,int b){return a>b?b:a;}
int main(){
scanf("%d%d",&n,&m);
memset(s,0xff,sizeof(s));
while(m--){
scanf("%d%d%d",&a,&b,&c);
v[a].push_back({c,b});
v[b].push_back({c,a});
}
scanf("%d%d",d+1,d+2);
for(j=0;j<3;j++){
q.push({0,d[j]});
while(!q.empty()){
p z=q.top();q.pop();
if(s[j][z.second]>0)continue;
s[j][z.second]=z.first;
for(i=0;i<v[z.second].size();i++){
p t=v[z.second][i];
if(s[j][t.second]<0)q.push({z.first+t.first,t.second});
}
}
}
if(s[0][d[1]]>=0&&s[0][d[2]]>=0&&s[0][n]>=0)
printf("%d",g(s[0][d[1]]+s[1][d[2]]+s[2][n],s[0][d[2]]+s[2][d[1]]+s[1][n]));
else printf("-1");
}
'PS' 카테고리의 다른 글
[백준]철로(13334) (0) | 2020.10.31 |
---|---|
[백준]오등큰수(17299) (0) | 2020.10.30 |
[백준]The Other Way(14554) (0) | 2020.10.29 |
[백준]물대기(1368) (0) | 2020.10.24 |
[백준]평균값 수열(5485) (3) | 2020.10.02 |
Comments