반응형
12-24 00:25
Today
Total
«   2024/12   »
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
관리 메뉴

개발하는 고라니

[백준] 17616번 : 등수 찾기 본문

Programming/백준

[백준] 17616번 : 등수 찾기

조용한고라니 2021. 4. 3. 15:00
반응형
 

17616번: 등수 찾기

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에 세 정수 N, M, X가 공백을 사이에 두고 주어진다. (2 ≤ N ≤ 105, 1 ≤ M ≤ min(N(N-1)/2, 5×105), 1 ≤ X ≤ N) . 다음 M 줄에는 각각 두 정수 A, B가 주어

www.acmicpc.net


[DFS]

등수를 알고싶은 x번째 정점에서 DFS를 2번 수행 해야하므로 인접리스트를 2개 만든다.

입력으로 A B가 주어졌을 때,

list[B][0].add(A),

list[A][1].add(B)

처럼 2개의 인접리스트를 만들면 된다.

 

DFS의 내부는 간단하다. 기본적으로 int rank = 1을 갖고 인접리스트를 돌며 방문하지 않은 정점을 돌며 계속 그 값을 더해나간다.

    static int DFS(int x, int idx){

        visit[x] = true;
        int rank = 1;

        for(int next:list[x][idx])
            if(!visit[next])
                rank += DFS(next, idx);

        return rank;
    }

이제 x의 가장 높은 등수, 가장 낮은 등수를 구하면 되는데 구하는 방법은 다음과 같다.

        int u = DFS(x, 0); //가장 높은 등수
        
        visit = new boolean[100001];
        
        int v = n - DFS(x, 1) + 1; //가장 낮은 등수

다음은 문제의 마지막 예시 입력에 대한 풀이이다.

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

    static List<Integer>[][] list = new ArrayList[100001][2];
    static boolean[] visit = new boolean[100001];

    static int DFS(int x, int idx){

        visit[x] = true;
        int rank = 1;

        for(int next:list[x][idx])
            if(!visit[next])
                rank += DFS(next, idx);

        return rank;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());

        for(int i=1; i<=n; i++) {
            list[i][0] = new ArrayList<>();
            list[i][1] = new ArrayList<>();
        }

        for(int i=0; i<m; i++){
            st = new StringTokenizer(br.readLine());

            int v1 = Integer.parseInt(st.nextToken());
            int v2 = Integer.parseInt(st.nextToken());

            list[v2][0].add(v1); //가장 높은
            list[v1][1].add(v2); //가장 낮은
        }

        int u = DFS(x, 0);
        int v = n - DFS(x, 1) + 1;

        System.out.println(u + " " + v);
    }
}
/*11 10 1
1 2
2 6
6 7
7 8
3 2
4 2
5 2
9 1
10 5
11 10*/
반응형
Comments