https://www.acmicpc.net/problem/1707
1707번: 이분 그래프
입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에
www.acmicpc.net
문제 접근
[ 참고 ]https://www.youtube.com/watch?v=mDSQfb5Rqc4
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Integer>[] A;
static int[] check;
static boolean[] visited;
static boolean IsEven;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int K = Integer.parseInt(br.readLine());
while (K-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
A = new ArrayList[V + 1];
visited = new boolean[V + 1];
check = new int[V + 1];
IsEven = true;
for (int i = 0; i < V + 1; i++) {
A[i] = new ArrayList<>();
}
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
A[a].add(b);
A[b].add(a);
}
// 모든 노드에서 DFS 실행해야함
for (int i = 1; i <= V; i++) {
if (IsEven) { // 이분 그래프인가
dfs(i);
} else {
break; // 이분 그래프가 아닌게 확정되면 반복문 탈출(더 볼 필요 없음.)
}
}
if (IsEven)
System.out.println("YES");
else
System.out.println("NO");
}
}
private static void dfs(int v) {
visited[v] = true;
for (int i : A[v]) {
if (!visited[i]) {
// 바로 직전에 있는 노드와 다른 집합으로 분류해주기(0 또는 1로)
check[i] = (check[v] + 1) % 2; // 토글처럼
dfs(i);
} else if (check[v] == check[i]) { // 이미 방문한 노드 & 직전 노드와 같은 집합이면
IsEven = false;
}
}
}
}
눈 여겨볼 것
- isEven으로 이분 그래프인지 표시, 이분 그래프가 아닌게 확정되면 더 탐색하지 않고 반복문 탈출
- 인접리스트로 그래프를 표현
- 집합 분류를 %2를 함으로써 토글처럼 한 것.
'백준' 카테고리의 다른 글
그래프 문제(bfs,dfs) #1991: 트리 순회 [JAVA] (1) | 2024.02.09 |
---|---|
그래프 문제(bfs,dfs) #4963: 섬의 개수 [JAVA] (1) | 2024.02.08 |
그래프 문제(bfs,dfs) #11724: 연결 요소의 개수 [JAVA] (0) | 2023.08.11 |
이런저런 문제들 #1373: 2진수 8진수 [JAVA] (0) | 2023.08.11 |
그래프 문제(bfs,dfs) #1260: DFS와 BFS [JAVA] (0) | 2023.08.09 |