본문 바로가기

ProgramSoliving

백준 : 2617

반응형

https://www.acmicpc.net/problem/2617

 

2617번: 구슬 찾기

모양은 같으나, 무게가 모두 다른 N개의 구슬이 있다. N은 홀수이며, 구슬에는 번호가 1,2,...,N으로 붙어 있다. 이 구슬 중에서 무게가 전체의 중간인 (무게 순서로 (N+1)/2번째) 구슬을 찾기 위해서 아 래와 같은 일을 하려 한다. 우리에게 주어진 것은 양팔 저울이다. 한 쌍의 구슬을 골라서 양팔 저울의 양쪽에 하나씩 올려 보면 어느 쪽이 무거운 가를 알 수 있다. 이렇게 M개의 쌍을 골라서 각각 양팔 저울에 올려서 어느 것이 무거운 가를 모

www.acmicpc.net

DFS

문제가 하도안풀리길래 질문 게시글을 보았다. 테스트 케이스중에 u v 가 같은 순환형 케이스가 존재한다는 것이다.

 

1이 1보다 크다 라는 말이 말이안되서 예외처리를 안햇는데 이것때문에 오랜 시간을 잡아 먹었다.

 

푸든 방법은 DAG 편방향 그래프를 그린다. 이때 아예 편방향 그래프를 In 그래프 Out 그래프 두가지를 만들거나

 

Out 그래프 하나만 만들어서 in out 수자를 세는 방법이 있다.

 

나는 out 그래프에서 시작하는 노드의 Out[n] 값을 노드에 도착할때마다 증가시키고

 

In[n] 그래프는 도착했으면 증가시키는 방향으로 In Out의 숫자를 카운팅 하였다.

 

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package day0225;
 
 
public class B2617 {
    static int N, M;
    static ArrayList<Integer> ver[];
    static int In[];
    static int Out[];
    static int n;
    static boolean visit[];
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
 
        In = new int[N + 1];
        Out = new int[N + 1];
 
        ver = new ArrayList[N + 1];
        for (int n = 1; n <= N; n++) {
            ver[n] = new ArrayList<Integer>();
        }
 
        for (int m = 0; m < M; m++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
 
            ver[u].add(v);
        }
 
        for (n = 1; n <= N; n++) {
            visit = new boolean[N+1];
            visit[n] = true;
            int size = ver[n].size();
            for (int s = 0; s < size; s++) {
                if(visit[ver[n].get(s)])continue;
                Out[n]++;
                DFS(ver[n].get(s));
            }
 
        }
        
        int Answer = 0;
        int mid = (N+1)/2;
        for(n =1;n<=N;n++) {
            if(Out[n]>=mid) {
                Answer++;
            }else if( In[n] >=mid) {
                Answer++;
            }
        }
        System.out.println(Answer);
 
    }
 
    public static void DFS(int cur) {
        visit[cur] = true;
        In[cur]++;
        
        int size = ver[cur].size();
        for(int s=0;s<size;s++) {
            if(visit[ver[cur].get(s)])continue;
            Out[n]++;
            DFS(ver[cur].get(s));
        }
    }
}
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 2042 ( 세그먼트 트리)  (0) 2020.02.27
백준 : 1517  (0) 2020.02.26
백준 : 2251  (0) 2020.02.25
백준 : 5719  (0) 2020.02.25
백준 : 1967  (0) 2020.02.24