[BOJ] 백준 1707. 이분 그래프

2024. 9. 29. 14:38· Java/BOJ

문제

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


풀이

 이분 그래프를 판별하는 문제이다. 이분 그래프는 인접한 정점끼리 서로 다른 색으로 칠해서 모든 정점을 두 가지 색으로만 칠할 수 있는 그래프를 말한다.

 

 풀이는 간단한데, 방문 시 1과 -1의 값으로 번갈아가며 방문 배열을 채워나가고, 만약 이전 방문 배열 값과 다음 방문 배열 값이 같으면 NO를 출력하면 끝이다.

 

 그런데 여기서 주의해야할 것은 이분 그래프의 정의인데, 연결되지 않은 정점도 독립적인 그룹으로 이분 그래프의 조건을 만족한다.

https://nahwasa.com/entry/%EC%9D%B4%EB%B6%84-%EA%B7%B8%EB%9E%98%ED%94%84-bipartite-graph

 

그래서 탐색을 시작할 시작점은 방문되지 않은 점이 대상이 된다. (즉 모든 정점이 연결되어 있다고는 가정되어있지 않다! 이것땜에 43프로에서 틀렸다.)

 

다음은 소스 코드이다.


소스 코드

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.Scanner;

public class B1707_이분그래프 {
    static int T, V, E;
    static ArrayList<Integer>[] list;
    static Queue<Integer> queue;
    static int[] colors;
    static Scanner sc = new Scanner(System.in);
    
    public static void main(String[] args) {
        T = sc.nextInt();
        for(int tc=0; tc<T;tc++){
            initValues();
            process();
        }
    }

    static void process(){
        boolean isValid = true;
        for(int v = 1; v<=V; v++){
            if(colors[v] == 0) {
                isValid = checkBipartiteGraph(v);
            }
            if(!isValid) break;
        }
        System.out.println(isValid?"YES":"NO");
    }

    static boolean checkBipartiteGraph(int start){
        queue = new ArrayDeque<>();
        queue.add(start);
        colors[start] = 1;

        while(!queue.isEmpty()){
            int v = queue.poll();
            for(int v2:list[v]){
                if(colors[v2] == 0){
                    colors[v2] = colors[v]*-1;
                    queue.add(v2);
                }
                if(colors[v2]==colors[v]){
                    return false;
                }
            }
        }
        return true;
    }

    static void initValues(){
        V = sc.nextInt();
        E = sc.nextInt();

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

        for(int i = 0; i<E;i++){
            int st = sc.nextInt();
            int ed = sc.nextInt();
            list[st].add(ed);
            list[ed].add(st);
        }
    }
}

'Java > BOJ' 카테고리의 다른 글

[BOJ] 백준 11559. 뿌요뿌요  (2) 2024.09.18
[BOJ] 백준 1461. 도서관  (1) 2024.09.14
[BOJ] 백준 25192. 인사성 밝은 곰곰이  (0) 2024.07.21
[BOJ] 백준 14658. 하늘에서 별똥별이 빗발친다  (0) 2024.06.30
[BOJ] 백준 1774. 우주신과의 교감  (1) 2024.06.24
'Java/BOJ' 카테고리의 다른 글
  • [BOJ] 백준 11559. 뿌요뿌요
  • [BOJ] 백준 1461. 도서관
  • [BOJ] 백준 25192. 인사성 밝은 곰곰이
  • [BOJ] 백준 14658. 하늘에서 별똥별이 빗발친다
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (178)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (33)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (6)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Java
  • JCF
  • 한양대
  • BOJ
  • OS
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • 자바
  • 김영한
  • 운영체제
  • 인프런
  • 네트워크
  • 프로그래머스
  • 큐
  • 스택
  • 반효경
  • 이석복
  • 레디스
  • 백준
  • 자바스크립트
  • 구현

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[BOJ] 백준 1707. 이분 그래프
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.