-
백준 - 1707, 이분 그래프취업 준비/알고리즘 2025. 2. 27. 17:21
이분 그래프 성공
시간 제한메모리 제한제출정답맞힌 사람정답 비율2 초 256 MB 108914 30502 18958 25.101% 문제
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다.
그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에 두고 순서대로 주어진다. 각 정점에는 1부터 V까지 차례로 번호가 붙어 있다. 이어서 둘째 줄부터 E개의 줄에 걸쳐 간선에 대한 정보가 주어지는데, 각 줄에 인접한 두 정점의 번호 u, v (u ≠ v)가 빈 칸을 사이에 두고 주어진다.
출력
K개의 줄에 걸쳐 입력으로 주어진 그래프가 이분 그래프이면 YES, 아니면 NO를 순서대로 출력한다.
제한
- 2 ≤ K ≤ 5
- 1 ≤ V ≤ 20,000
- 1 ≤ E ≤ 200,000
예제 입력 1 복사
2 3 2 1 3 2 3 4 4 1 2 2 3 3 4 4 2예제 출력 1 복사
YES NOimport java.io.*; import java.util.*; public class baekjun_1707 { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); for (int test_case = 0; test_case < T; test_case++) { StringTokenizer st = new StringTokenizer(br.readLine()); int V = Integer.parseInt(st.nextToken()); int E = Integer.parseInt(st.nextToken()); ArrayList<Integer>[] list = new ArrayList[V + 1]; for (int i = 1; i <= V; i++) { list[i] = new ArrayList<>(); } // 그래프 입력 받기 for (int i = 0; i < E; i++) { st = new StringTokenizer(br.readLine()); int left = Integer.parseInt(st.nextToken()); int right = Integer.parseInt(st.nextToken()); list[left].add(right); list[right].add(left); } String answer = isBipartite(V, list); System.out.println(answer); } } static String isBipartite(int V, ArrayList<Integer>[] list) { int[] check = new int[V + 1]; Arrays.fill(check, 0); for (int i = 1; i <= V; i++) { if (check[i] == 0) { // 방문하지 않은 노드이면 BFS 실행 if (!bfs(i, list, check)) { return "NO"; // 이분 그래프가 아니면 NO 반환 } } } return "YES"; // 모든 노드가 이분 그래프 조건을 만족하면 YES } static boolean bfs(int start, ArrayList<Integer>[] list, int[] check) { Queue<Integer> queue = new LinkedList<>(); queue.add(start); check[start] = 1; // 시작점 1 while (!queue.isEmpty()) { int cur = queue.poll(); for (int neighbor : list[cur]) { if (check[neighbor] == 0) { // 방문하지 않은 경우 check[neighbor] = -check[cur]; // 현재 노드와 다른 값으로 바꿔줌 queue.add(neighbor); } else if (check[neighbor] == check[cur]) { // 인접한 두 노드가 같으면 이분 그래프 아님 return false; } } } return true; } }'취업 준비 > 알고리즘' 카테고리의 다른 글
프로그래머스 - 즐겨찾기가 가장 많은 식당 정보 출력하기 (4) 2025.02.28 백준 - 1717, 집합의 표현 (2) 2025.02.28 프로그래머스 - 저자 별 카테고리 별 매출액 집계하기 (4) 2025.02.25 프로그래머스 - 카테고리 별 도서 판매량 집계하기 (0) 2025.02.25 프로그래머스 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (2) 2025.02.25