티스토리 뷰
728x90
문제
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (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
문제 풀이 과정
탐색 문제 풀이 과정으로 이 문제를 해결 할수 있다. 기존 탐색과 같은 방법으로 문제를 해결 할수 있지만, 탐색한 노드에 다시 접근했을 때 현재 노드의 집합과 같으면 이분 그래프가 불가능 하다는 것으로 문제를 접근하였다.
리스트를 초기화 할때 양방향으로 리스트를 초기화해준다
for (int j = 0; j < e; j++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list[a].add(b);
list[b].add(a);
}
하기 코드는 탐색하는 코드이며, 재귀적 방법으로 구현하였다. check[item] = (check[start]+1)%2 이것으로 2개의 집합으로 나누었다.
public static void DFS(int start){
visitied[start] = true;
for(int item : list[start]){
if(!visitied[item]){
check[item] = (check[start]+1)%2;
DFS(item);
}
else if(check[item] == check[start]){
flag = false;
}
}
}
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static ArrayList<Integer>[] list;
public static boolean[] visitied;
public static int[] check;
public static boolean flag;
public static void DFS(int start){
visitied[start] = true;
for(int item : list[start]){
if(!visitied[item]){
check[item] = (check[start]+1)%2;
DFS(item);
}
else if(check[item] == check[start]){
flag = false;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCase = Integer.parseInt(br.readLine());
String[] answer = new String[testCase];
for (int i = 0; i < testCase; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
list = new ArrayList[n+1];
for (int j = 0; j < n+1; j++) {
list[j] = new ArrayList<>();
}
for (int j = 0; j < e; j++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list[a].add(b);
list[b].add(a);
}
visitied = new boolean[n+1];
check = new int[n+1];
flag = true;
for (int j = 1; j < n+1 ; j++) {
if(flag){
DFS(j);
}
else{
break;
}
}
if(flag){
answer[i] = "YES";
}
else{
answer[i] = "NO";
}
}
for(String item : answer){
System.out.println(item);
}
}
}
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 4386번 - 별자리 만들기 (JAVA) (1) | 2023.01.11 |
---|---|
백준 11399번 - ATM (JAVA) (0) | 2022.12.16 |
백준 1325번 - 효율적인 해킹 (JAVA) (0) | 2022.12.15 |
백준 7576번 - 토마토 (0) | 2022.12.05 |
백준 10026번 - 적록색약 (0) | 2022.12.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코딩테스트공부
- 백엔드 개발자 취업 준비
- 백준
- 주니어 개발자 취업 준비
- 프로그래머스 자바
- 알고리즘
- 코딩테스트 준비
- 취준
- 백엔드 개발자
- 기술 면접 준비
- 알고리즘 공부
- 개발자 면접 준비
- 코테준비
- 코테 준비
- 코딩테스트 공부
- 취업 준비
- 프로그래머스 카카오
- 자바
- 알고리즘공부
- 백엔드 개발자 기술 면접 준비
- 제로베이스 백엔드 스쿨
- java
- 자바공부
- 취업준비
- 프로그래머스
- 코테공부
- 개발자 취준
- 코딩테스트
- 개발자 취업 준비
- 제로베이스 백준 장학금
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함