티스토리 뷰

www.acmicpc.net/problem/1707

1. 문제

그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다.

그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.

입)

입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K(2≤K≤5)가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V(1≤V≤20,000)와 간선의 개수 E(1≤E≤200,000)가 빈 칸을 사이에 두고 순서대로 주어진다. 각 정점에는 1부터 V까지 차례로 번호가 붙어 있다. 이어서 둘째 줄부터 E개의 줄에 걸쳐 간선에 대한 정보가 주어지는데, 각 줄에 인접한 두 정점의 번호가 빈 칸을 사이에 두고 주어진다.

출)

K개의 줄에 걸쳐 입력으로 주어진 그래프가 이분 그래프이면 YES, 아니면 NO를 순서대로 출력한다.

2. 풀이

import java.util.*;

public class Main {
	// DFS 사용해서 해결.
    public static void dfs(ArrayList<Integer>[] a, int[] color, int x, int c) {
        color[x] = c;
        for (int y : a[x]) {
            if (color[y] == 0) {
                dfs(a, color, y, 3-c);
            }
        }
    }
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        // 테스트 수
        int t = sc.nextInt();
        while (t-- > 0) {
            // 정점 수
            int n = sc.nextInt();
            // 간선 수
            int m = sc.nextInt();
            // 인접리스트 생성 및 초기화
            ArrayList<Integer>[] a = (ArrayList<Integer>[]) new ArrayList[n+1];
            for (int i=1; i<=n; i++) {
                a[i] = new ArrayList<Integer>();
            }
            for (int i=0; i<m; i++) {
                int u = sc.nextInt();
                int v = sc.nextInt();
                a[u].add(v);
                a[v].add(u);
            }
            
            // 방문 여부 배열
            // 방문X - 0, 그룹1 - 1, 그룹2 - 2
            int[] color = new int[n+1];
            // 이분 그래프 여부값
            boolean ok = true;
            // 방문 안한 노드부터 DFS
            for (int i=1; i<=n; i++) {
                if (color[i] == 0) {
                    dfs(a, color, i, 1);
                }
            }
            
            // 인접한 정점이 같은 그룹인지 체크
            for (int i=1; i<=n; i++) {
            	// 한 노드의 인접한 노드들을 순회하면서
                for (int j : a[i]) {
                	// 그룹이 같은 경우 false
                    if (color[i] == color[j]) {
                        ok = false;
                    }
                }
            }
            if (ok) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }

    }
}

DFS를 사용해서 해결.

이전과 다르게 방문여부와 그룹여부를 같이 저장하기 위해서 color라는 int 배열로 선언하여, 방문 안했으면 0, 그룹 1이면 1, 그룹 2면 2로 저장하면서 DFS를 수행 후, 마지막에 노드 별로 인접한 노드를 순회하면서 그룹이 동일한 경우 이분 그래프가 아닌 것으로 판명하도록 처리.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함