티스토리 뷰

알고리즘/BOJ

[백준] 5214 환승

세진짱 2020. 3. 31. 14:35

옛날에 풀어본 문제여서 다시 풀어보려고 했는데 탈탈 털렸다

옛날에는 어떻게 풀었을까? 도움을 받았었나 ㅎㅎ

 

이 문제는 하이퍼링크는 연결되어있기 때문에 안에서는 비용이 안들고

하이퍼링크를 넘어갈 때는 비용이 든다는걸 그래프로 표현해야한다

 

어떻게 해야할까..!

그래프를 만들때 (N+M)개의 정점으로 만들어주면 된다!

 

1~N 까지는 정점이고 (N+1 + M)까지는 바로 하이퍼링크..!

 

내가 어떤 점 X 가 하이퍼링크 K에 속해있다면

그래프 X에서는 갈 수 있는 하이퍼링크 K에 연결시켜주고 1의 비용이 들고

반대로 하이퍼링크 K 에서는 갈 수 있는 점들 X를 연결하고

하이퍼링크 안에서 이동이므로 비용은 0이 된다!

 

그래서 그래프를 만들면

 

X -> K (비용 1) 하이퍼링크 밖에서 이동 (정점 X를 가진 하이퍼링크 K로 이동)

K -> X (비용 0) 하이퍼링크 안에서 이동 (하이퍼링크 K에 속한 정점들로 이동)

 

이런 개념으로 만들어진다

 

어렵다..!

어떻게 생각할까 이런건 ㅎㅎ

 

그래프를 그려준다면 그 다음엔 최단거리 알고리즘으로 변한다!

다익스트라를 사용했다

 

소스코드

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
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
int n,m,k;
const int MAXN  =1e5+5;
int d[MAXN+1111];
 
int main(){
 
    scanf(" %d %d %d",&n,&k,&m);
    memset(d,-1,sizeof(d));
    vector<vector<pair<int,int>>> Graph(n+m+1);
    for(int i=n+1;i<n+m+1;i++){
        for(int j=0;j<k;j++){
            int x; scanf(" %d",&x);
            Graph[x].push_back({i,1});
            Graph[i].push_back({x,0});
        }
    }
    priority_queue<pair<int,int>> pq;
    pq.push({0,1});
 
    while(!pq.empty()){
        int now = pq.top().second;
        int cost = -pq.top().first;
        pq.pop();
 
        if(d[now] != -1continue;
        d[now]=cost;
 
        for(int i=0;i<Graph[now].size();i++){
            int next = Graph[now][i].first;
            int ncost = -cost -Graph[now][i].second;
            if(d[next]==-1pq.push({ncost,next});
        }
    }
 
    printf("%d\n",(d[n]==-1) ? -1 : d[n]+1);
}
 
 
 

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 16227 의약품 수송  (0) 2020.04.05
[백준] 3088 화분 부수기  (0) 2020.03.30
[백준] 9765 여섯 방정식  (0) 2020.03.30
[백준] 16932 모양 만들기  (0) 2020.03.06
[백준] 2580 스도쿠  (0) 2020.02.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
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
글 보관함