본문 바로가기
알고리즘 문제풀이/백준

[백준 1707] 이분 그래프(JAVA)

by 소보루:-) 2020. 3. 11.

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

 

1707번: 이분 그래프

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

www.acmicpc.net

 

 

Scanner로 입력 받았을 때와 BufferedReader로 입력받았을 때 시간차이가 많이 난다.

 

이분 그래프는 각 노드마다, 자기 자신과 연결된 노드의 색깔이 달라야 하는 그래프이다.

노드의 색깔을 모두 0으로 두고 dfs로 1 또는 2로 색칠해 준 다음, 이분 그래프인지 체크해주었다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {

	static int V,E;
	static List[] list;
	static int color[];
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int K=sc.nextInt();
		for(int tc=1; tc<=K; tc++) {
			V=sc.nextInt();
			E=sc.nextInt();
			list =new ArrayList[V+1];
			for(int i=1; i<=V; i++) {
				list[i]=new ArrayList();
			}
			color=new int[V+1];
			for(int e=0; e<E; e++) {
				int n1=sc.nextInt();
				int n2=sc.nextInt();
				list[n1].add(n2);
				list[n2].add(n1);
			}
			for(int i=1; i<=V; i++) {
				if(color[i]==0) {
					dfs(i,1);
				}
			}
			if(isPossible()) {
				System.out.println("YES");
			}else System.out.println("NO");
			
		}
	}
	private static boolean isPossible() {
		for(int i=1; i<=V; i++) {
			for(int j=0; j<list[i].size(); j++) {
				if(color[i]==color[(int)list[i].get(j)]) {
					return false;
				}
			}
		}
		return true;
	}
	private static void dfs(int node, int c) {
		color[node]=c;
		for(int i=0; i<list[node].size(); i++) {
			int next=(int)list[node].get(i);
			if(color[next]==0) {
				dfs(next,3-c);
			}
		}
	}

}

댓글