코테/백준

[백준/JAVA] 1707번: 이분 그래프

imname1am 2023. 4. 27. 23:58
반응형

🔺 문제

 

1707번: 이분 그래프

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에

www.acmicpc.net

 

🔺 코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    static ArrayList<Integer>[] A;  // 인접 리스트
    static int[] check;             // 이분 그래프 체크 배열
    static boolean[] visited;       // 방문 배열
    static boolean isEven;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        int K = Integer.parseInt(br.readLine());
        
        while(K --> 0) {
            st = new StringTokenizer(br.readLine(), " ");
            int V = Integer.parseInt(st.nextToken());
            int E = Integer.parseInt(st.nextToken());
            
            A = new ArrayList[V + 1];
            for(int j = 1 ; j <= V ; j++) {
                A[j] = new ArrayList<>();
            }
 
            visited = new boolean[V + 1];
            check = new int[V + 1];
            
            while(E --> 0) {
                st = new StringTokenizer(br.readLine(), " ");
                int s = Integer.parseInt(st.nextToken());
                int e = Integer.parseInt(st.nextToken());
                
                A[s].add(e);
                A[e].add(s);
            }
            
            // 🔔 모든 노드에서 수행 🔔
            isEven = true;
            for(int i = 1 ; i <= V ; i++) {
                if(isEven)  dfs(i);
                else        break;
            }
            
            System.out.println(isEven ? "YES" : "NO");
        }
    }
    
    static void dfs(int idx) {
        visited[idx] = true;
        
        for(int next : A[idx]) {
            if(!visited[next]) {
                // 인접한 노드는 같은 집합이 아니므로 이전 노드와 다른 집합으로 처리 (= 이분 그래프)
                check[next] = (check[idx] + 1) % 2;
                dfs(next);
            }
            // 🔔 이미 방문한 노드가 현재 내 노드와 같은 집합이면, 이분 그래프 X 🔔
            else if(check[idx] == check[next]) {
                isEven = false;
            }
        }
    }
}
 
cs
✅ 해결 아이디어
DFS / BFS

 

- 트리는 원래 이분 그래프임 (사이클 X)

- 자신과 반대팀 처리 : check[i] = (check[node] + 1) % 2;

 


🔺 다른 풀이들

- BFS 사용 & 이해하기 제일 깔끔! (인자 1개)

 

이분 그래프 [백준 1707][골드4][Java]

[광고 누르면 오늘의 행운 상승!!] https://www.acmicpc.net/problem/1707 1707번: 이분 그래프 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각

toastfactory.tistory.com

 

 

- BFS 사용 (인자 2개)

: 자신과 반대팀을 team[i] = team[node] * -1; 이렇게 -1을 곱해 처리하셨다.

 

[백준 - Java] 1707번 : 이분 그래프

백준 알고리즘 Java - 1707번 : 이분 그래프

velog.io

 

[java 백준] 골드 4/ 1707번 이분 그래프

https://www.acmicpc.net/problem/1707 1707번: 이분 그래프 입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의

we1cometomeanings.tistory.com


💬 느낀 점

이분 그래프 개념 혼자 이해하는 것부터 이해를 못 하였읍니다<,,,^^

다른 분들 글 보고서 그제서야 이해함,,,ㅎㅎ

뇌야 활동해라!!!

 

1회독 2회독 3회독 4회독 5회독
V 6/21      
반응형