Skip to content

Commit b8413c4

Browse files
committed
DFS, BFS / 이분 그래프 개념 익히기
1 parent fe968f2 commit b8413c4

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
2+
/* ************************************************************************** */
3+
/* */
4+
/* ::: ::: ::: */
5+
/* Problem Number: 1707 :+: :+: :+: */
6+
/* +:+ +:+ +:+ */
7+
/* By: thxogh1 <boj.kr/u/thxogh1> +#+ +#+ +#+ */
8+
/* +#+ +#+ +#+ */
9+
/* https://boj.kr/1707 #+# #+# #+# */
10+
/* Solved: 2025/05/14 08:37:22 by thxogh1 ### ### ##.kr */
11+
/* */
12+
/* ************************************************************************** */
13+
import java.io.BufferedReader;
14+
import java.io.InputStreamReader;
15+
import java.util.ArrayDeque;
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
import java.util.Queue;
19+
import java.util.StringTokenizer;
20+
21+
public class Main {
22+
static boolean[] visited;
23+
static int[] type;
24+
25+
static class Node {
26+
int num;
27+
int type;
28+
29+
Node(int num, int type) {
30+
this.num = num;
31+
this.type = type;
32+
}
33+
}
34+
35+
static boolean bfs(List<List<Integer>> li, Node node) {
36+
37+
Queue<Node> q = new ArrayDeque<>();
38+
q.offer(node);
39+
40+
while (!q.isEmpty()) {
41+
Node now = q.poll();
42+
43+
for (int next : li.get(now.num)) {
44+
if (now.type == type[next]) {
45+
return false;
46+
} else if (visited[next]) {
47+
continue;
48+
}
49+
visited[next] = true;
50+
51+
if (type[next] == 0) {
52+
if (now.type == 1) {
53+
q.offer(new Node(next, 2));
54+
type[next] = 2;
55+
} else if (now.type == 2) {
56+
q.offer(new Node(next, 1));
57+
type[next] = 1;
58+
}
59+
}
60+
61+
}
62+
}
63+
64+
return true;
65+
}
66+
67+
public static void main(String[] args) throws Exception {
68+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
69+
StringTokenizer st;
70+
int tc = Integer.parseInt(br.readLine());
71+
72+
while (tc-- > 0) {
73+
st = new StringTokenizer(br.readLine());
74+
75+
int v = Integer.parseInt(st.nextToken());
76+
int e = Integer.parseInt(st.nextToken());
77+
78+
List<List<Integer>> li = new ArrayList<>();
79+
visited = new boolean[v + 1];
80+
type = new int[v + 1];
81+
for (int i = 0; i < v + 1; i++) {
82+
li.add(new ArrayList<>());
83+
}
84+
for (int i = 0; i < e; i++) {
85+
st = new StringTokenizer(br.readLine());
86+
int start = Integer.parseInt(st.nextToken());
87+
int end = Integer.parseInt(st.nextToken());
88+
li.get(start).add(end);
89+
li.get(end).add(start);
90+
}
91+
boolean success = true;
92+
for (int i = 1; i < v + 1; i++) {
93+
if (type[i] == 0) {
94+
if (!bfs(li, new Node(i, 1))) {
95+
System.out.println("NO");
96+
success = false;
97+
break;
98+
}
99+
}
100+
}
101+
if (success) {
102+
System.out.println("YES");
103+
}
104+
}
105+
}
106+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# 1707번: 이분 그래프 - <img src="https://static.solved.ac/tier_small/12.svg" style="height:20px" /> Gold IV
2+
3+
<!-- performance -->
4+
5+
<!-- 문제 제출 후 깃허브에 푸시를 했을 때 제출한 코드의 성능이 입력될 공간입니다.-->
6+
7+
<!-- end -->
8+
9+
## 문제
10+
11+
[문제 링크](https://boj.kr/1707)
12+
13+
<p>그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있을 때, 그러한 그래프를 특별히 이분 그래프 (Bipartite Graph) 라 부른다.</p>
14+
15+
<p>그래프가 입력으로 주어졌을 때, 이 그래프가 이분 그래프인지 아닌지 판별하는 프로그램을 작성하시오.</p>
16+
17+
## 입력
18+
19+
<p>입력은 여러 개의 테스트 케이스로 구성되어 있는데, 첫째 줄에 테스트 케이스의 개수 K가 주어진다. 각 테스트 케이스의 첫째 줄에는 그래프의 정점의 개수 V와 간선의 개수 E가 빈 칸을 사이에 두고 순서대로 주어진다. 각 정점에는 1부터 V까지 차례로 번호가 붙어 있다. 이어서 둘째 줄부터 E개의 줄에 걸쳐 간선에 대한 정보가 주어지는데, 각 줄에 인접한 두 정점의 번호 u, v (u ≠ v)가 빈 칸을 사이에 두고 주어진다.&nbsp;</p>
20+
21+
## 출력
22+
23+
<p>K개의 줄에 걸쳐 입력으로 주어진 그래프가 이분 그래프이면 YES, 아니면 NO를 순서대로 출력한다.</p>
24+
25+
## 소스코드
26+
27+
[소스코드 보기](Main.java)

0 commit comments

Comments
 (0)