Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f0e0bea

Browse files
committed
고다혜: [BOJ] 1707 이분 그래프_250214
1 parent 70a26a9 commit f0e0bea

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

‎BOJ/1000-5000번/DH_1707.java‎

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 이분 그래프
6+
*/
7+
8+
public class DH_1707 {
9+
static ArrayList<Integer> adj[];
10+
static boolean[] v, check;
11+
12+
public static void main(String[] args) throws Exception {
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
StringTokenizer st;
15+
StringBuilder sb = new StringBuilder();
16+
17+
int t = Integer.parseInt(br.readLine());
18+
19+
for(int tc = 0; tc < t; tc++) {
20+
st = new StringTokenizer(br.readLine());
21+
22+
int V = Integer.parseInt(st.nextToken()), E = Integer.parseInt(st.nextToken());
23+
v = new boolean[V + 1];
24+
25+
adj = new ArrayList[V + 1]; // 인접리스트
26+
check = new boolean[V + 1]; // 그래프가 어떻게 나뉘는지에 대한 정보
27+
28+
for(int i = 0; i < adj.length; i++) adj[i] = new ArrayList<Integer>();
29+
30+
for(int k = 0; k < E; k++) {
31+
st = new StringTokenizer(br.readLine());
32+
33+
int a = Integer.parseInt(st.nextToken());
34+
int b = Integer.parseInt(st.nextToken());
35+
36+
adj[a].add(b);
37+
adj[b].add(a);
38+
}
39+
40+
boolean isEven = true;
41+
42+
// 첫 번째 노드부터 마지막 노드까지 BFS를 통해 탐색
43+
for(int i = 0; i < V + 1; i++) {
44+
if(v[i]) continue;
45+
if(!(isEven = bfs(i))) break;
46+
}
47+
48+
sb.append(isEven ? "YES" : "NO").append("\n");
49+
}
50+
51+
System.out.println(sb);
52+
}
53+
54+
static boolean bfs(int node) {
55+
56+
boolean isEven = true;
57+
58+
ArrayDeque<Integer> q = new ArrayDeque<Integer>();
59+
60+
q.add(node);
61+
v[node] = true;
62+
63+
while(!q.isEmpty()) {
64+
int current = q.poll();
65+
66+
for(int next: adj[current]) {
67+
// 다음 노드가 이미 방문된 상태일 때
68+
// 그래프를 이분그래프로 만들기 위해 분리했을 때, 분리되는 결과가 같다면 이분그래프를 만들지 못함
69+
if(v[next]) {
70+
if(check[next] == check[current]) return false;
71+
continue;
72+
}
73+
74+
// 다음 노드를 방문하지 않았다면
75+
// 그래프를 분리할 때, 현재 노드와 인접한 노드가 같은 그래프에 속하지 않도록 설정해줌
76+
v[next] = true;
77+
check[next] = !check[current];
78+
q.add(next);
79+
}
80+
}
81+
return isEven;
82+
}
83+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /