ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 6118번 숨바꼭질
    문제 풀이 2020. 6. 28. 16:46

    6118 숨바꼭질


    문제


    재서기는 수혀니와 교외 농장에서 숨바꼭질을 하고 있다. 농장에는 헛간이 많이 널려있고 재서기는 그 중에 하나에 숨어야 한다. 헛간의 개수는 N(2 <= N <= 20,000)개이며, 1 부터 샌다고 하자.  

    재서기는 수혀니가 1번 헛간부터 찾을 것을 알고 있다. 모든 헛간은 M(1<= M <= 50,000)개의 양방향 길로 이어져 있고, 그 양 끝을 A_i 와 B_i(1<= A_i <= N; 1 <= B_i <= N; A_i != B_i)로 나타낸다. 또한 어떤 헛간에서 다른 헛간으로는 언제나 도달 가능하다고 생각해도 좋다. 

    재서기는 발냄새가 지독하기 때문에 최대한 냄새가 안나게 숨을 장소를 찾고자 한다. 냄새는 1번 헛간에서의 거리(여기서 거리라 함은 지나야 하는 길의 최소 개수이다)가 멀어질수록 감소한다고 한다. 재서기의 발냄새를 최대한 숨길 수 있는 헛간을 찾을 수 있게 도와주자!


    입력


    첫 번째 줄에는 N과 M이 공백을 사이에 두고 주어진다.

    이후 M줄에 걸쳐서 A_i와 B_i가 공백을 사이에 두고 주어진다.


    출력


    출력은 한줄로 이루어지며, 세 개의 값을 공백으로 구분지어 출력해야한다. 

    첫 번째는 숨어야 하는 헛간 번호를(만약 거리가 같은 헛간이 여러개면 가장 작은 헛간 번호를 출력한다), 두 번째는 그 헛간까지의 거리를, 세 번째는 그 헛간과 같은 거리를 갖는 헛간의 개수를 출력해야한다.



    풀이)

    1번 헛간과 다른 헛간 사이의 거리를 구한 뒤, 가장 먼 거리를 찾으면 되는 문제이다.

    그와중에 거리는 최단거리로 구해야함을 주의하면 된다.

    -> 최단거리를 구하는 Dijkstra or Floyd algorithm을 사용


    나같은 경우는 Dijkstra를 이용해줬다.


    풀이과정

    1. 1번 헛간에에서 다른 헛간들 사이의 거리를 Dijkstra로 구한다.

    2. 처음부터 마지막 헛간까지 살펴보며, 가장 먼 헛간의 번호와 거리 그리고 그 헛간과 같은 거리를 갖는 헛간의 개수를 구한다.


    코드)

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
    #include <vector>
    #include <queue>
    using namespace std;
     
    vector <vector<int>>adj;
    int n; //헛간개수
    int INF = 999999999;
     
    vector <int> Dijkstra(int start) {
        vector <int> dist(n + 1, INF);
        priority_queue <pair<int,int>> qu; // 거리, 헛간번호
        qu.push({ 0,start });
        dist[start] = 0;
        while (!qu.empty())
        {
            int here = qu.top().second;
            int d = -qu.top().first;
            qu.pop();
            if (d > dist[here]) continue;
            for (int i = 0; i < adj[here].size(); i++) {
                int next = adj[here][i];
                int nextdist = d + 1;
                if (dist[next] > nextdist) {
                    dist[next] = nextdist;
                    qu.push({ -nextdist,next });
                }
            }
        }
        return dist;
    }
    int main() {
        int m;
        scanf("%d %d"&n, &m);
        adj.resize(n + 1);
        for (int i = 0; i < m; i++) {
            int start, end;
            scanf("%d %d"&start, &end);
            adj[start].push_back(end);
            adj[end].push_back(start); //양뱡향
     
        }
        vector <int> temp = Dijkstra(1);
        int maxver = 0;//헛간번호
        int maxcost = -1;//헛간까지의 거리
        int maxcount = 0;//헛간개수
        for (int i = 1; i < temp.size(); i++) { //헛간들은 다 연결되어있어서 temp[]값이 INF일수없음
            if (maxcost < temp[i]) {
                maxcost = temp[i];
                maxver = i;
                maxcount = 1;//
            }
            else if (maxcost == temp[i]) {
                maxcount += 1;
            }
        }
        printf("%d %d %d", maxver, maxcost, maxcount);
        return 0;
    }
    cs


    '문제 풀이' 카테고리의 다른 글

    [백준] 2343번 기타레슨  (0) 2020.06.30
    [백준] 1012번 유기농 배추  (0) 2020.06.29
    [백준] 2156번 포도주 시식  (0) 2020.06.27
    [프로그래머스] 저울  (0) 2020.06.25
    [백준] 2616번 소형기관차  (2) 2020.06.24

    댓글

Designed by Tistory.