λ¬Έμ
νμ΄
1οΈβ£ μ΄λΆ κ·Έλνμ μ μμ bfs λ₯Ό μ΄μ©ν νμ΄
μμ μ νμ΄λ΄€λ λ¬Έμ μ¬μ, μ리λ₯Ό μ½κ² νμ ν μ μμλ€.
μ΄μ μλ, νμ°Έμ κ³ λ―Όνμλ€κ° μμΉν΄μ νμμλλ°, μ΄λΆ κ·ΈλνλΌλ λ¨μ΄κ° λμ€λ©΄ μ΄ μ μλ₯Ό μκ°ν΄μΌνλ€.
μ΄λΆ κ·ΈλνμΈμ§ μλμ§ νμΈν μ μλ νΉμ§ μ€ νλμΈ,
λ Έλ κ·Έλνλ₯Ό 2κ°μ μκΉλ‘ μΉ νμ λ, μΈμ νλ λ ΈλλΌλ¦¬ μμ΄ κ²ΉμΉμ§ μκ² μμΉ ν μ μμ λ, μ΄λΆ κ·Έλνκ° λ μ μλ€κ³ νλ€.
μμ κ°μ κ·Έλ¦Όμ²λΌ λ§μ΄λ€.
μμ§ λ°©λ¬Ένμ§ μμ λ ΈλλΌλ©΄ 1λ‘ μ²΄ν¬ν΄λκ³ bfs λ°©μμΌλ‘ μ£Όλ³ λ Έλλ₯Ό νμνμ¬ -1λ‘ νμνκ²λ νμλ€.
κ·Έλ κ² λͺ¨λ λ Έλλ₯Ό νμν΄λκ³ , λ€μ λͺ¨λ λ Έλλ₯Ό μννμ¬ μ£Όλ³ λ Έλμ λ€λ₯Έ μ«μλ‘ λ§νΉλμ΄μλ λ Έλκ° μλ€λ©΄ μ΄λΆ κ·Έλνκ° μλμ μ μ μλ€.
public class Main {
static int V;
static int[] checked;
static Queue<Integer> q;
static List<List<Integer>> nodes;
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) {
String[] input = br.readLine().split(" ");
V = Integer.parseInt(input[0]);
int E = Integer.parseInt(input[1]);
nodes = new ArrayList<>();
for (int i = 0; i < V; i++) {
nodes.add(new ArrayList<>());
}
while (E-- > 0) {
input = br.readLine().split(" ");
int u = Integer.parseInt(input[0]) - 1, v = Integer.parseInt(input[1]) - 1;
nodes.get(u).add(v);
nodes.get(v).add(u);
}
checked = new int[V];
q = new LinkedList<>();
for (int i = 0; i < V; i++) {
if (checked[i] == 0) {
q.offer(i);
checked[i] = 1;
bfs();
}
}
if (checkBipartite()) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
private static boolean checkBipartite() {
for (int i = 0; i < V; i++) {
List<Integer> connects = nodes.get(i);
int color = checked[i];
for (int connect : connects) {
if (checked[connect] == color) {
return false;
}
}
}
return true;
}
private static void bfs() {
while (!q.isEmpty()) {
int u = q.poll();
List<Integer> connects = nodes.get(u);
for (int connect : connects) {
if (checked[connect] == 0) {
checked[connect] = checked[u] * -1;
q.offer(connect);
}
}
}
}
}
κ²°κ³Ό
μ΄λΆ κ·ΈλνμΈμ§ μλμ§λ₯Ό νλ¨ν μ μλ μ μλ₯Ό μ κΈ°μ΅ν΄λκ³ μμ΄μΌκ² λ€.