λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #1953 νŒ€λ°°λΆ„

by dar0m! 2020. 4. 21.
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
2 초 128 MB 43.773%

 

 

1953번: νŒ€λ°°λΆ„

μ²«μ€„μ—λŠ” μ²­νŒ€μ˜ μ‚¬λžŒμ˜ 수λ₯Ό 좜λ ₯ν•˜κ³ , 그리고 λ‘˜μ§Έ μ€„μ—λŠ” μ²­νŒ€μ— μ†ν•œ μ‚¬λžŒλ“€μ„ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ‚˜μ—΄ν•œλ‹€. 그리고 μ…‹μ§Έ 쀄과 λ„·μ§Έ 쀄은 μœ„μ™€ 같은 λ°©λ²•μœΌλ‘œ λ°±νŒ€μ— μ†ν•œ μΈμ›μ˜ 수, λ°±νŒ€μ— μ†ν•œ μ‚¬λžŒλ“€μ„ 좜λ ₯ν•œλ‹€. 단 닡이 μ—¬λŸ¬ 가지 일 κ²½μš°μ—λŠ” ν•œ κ°€μ§€λ§Œ 좜λ ₯ν•˜μ—¬λ„ μ’‹λ‹€.

www.acmicpc.net

 

문제

μ²­νŒ€κ³Ό λ°±νŒ€μœΌλ‘œ 두 νŒ€μ„ λ‚˜λˆ„μ–΄ νŒ€μ „μ„ ν•˜λ € ν•œλ‹€. ν•˜μ§€λ§Œ μ„œλ‘œ 같은 νŒ€μ„ ν•˜κΈ° μ‹«μ–΄ν•˜λŠ” μ‚¬λžŒλ“€μ΄ 생겼닀.

이제 μš°λ¦¬κ°€ ν•  일은 λ‹€μŒκ³Ό κ°™λ‹€. μ‚¬λžŒλ“€μ΄ 각각 μ‹«μ–΄ν•˜λŠ” μ‚¬λžŒλ“€μ˜ 정보가 μ£Όμ–΄μ Έ μžˆμ„ λ•Œ, κ·Έ μ‚¬λžŒλ“€μ˜ μš”κ΅¬λ₯Ό μˆ˜μš©ν•˜μ—¬ μ„œλ‘œ μ‹«μ–΄ν•˜λŠ” μ‚¬λžŒμ€ 같은 νŒ€μ— 넣지 μ•ŠμœΌλ € ν•œλ‹€. 이 쑰건을 λ§Œμ‘±ν•˜μ—¬ nλͺ…μ˜ μ‚¬λžŒλ“€ 두 νŒ€μœΌλ‘œ λ‚˜λˆ„λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ—¬λΌ.

μŠ€νŽ˜μ…œ 저지 문제둜, κΌ­ λ‚΄κ°€ ν‘Ό 방법이 μ•„λ‹ˆλ”λΌλ„ λ‹€μ–‘ν•œ 방법과 닡이 μ‘΄μž¬ν•œλ‹€.

 

ν•΄κ²°

key point, μ΄μ›ƒλœ λ…Έλ“œλ₯Ό 흰색, νŒŒλž€μƒ‰μœΌλ‘œ λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ μƒ‰μΉ ν•œλ‹€.
               ν°μƒ‰μ€ 1, νŒŒλž€μƒ‰μ€ -1둜 보고 νŒ€νŒλ³„κ³Ό λ™μ‹œμ— λ°©λ¬ΈνŒλ‹¨λ„ ν•˜κΈ° μœ„ν•΄μ„œ chk배열에 μ €μž₯ν–ˆλ‹€.
  1. i번 μ‚¬λžŒμ΄ μ‹«μ–΄ν•˜λŠ” μ‚¬λžŒλ“€μ˜ 정보가 주어지면, iλŠ” κ·Έ μ‚¬λžŒλ“€κ³Ό 같은 νŒ€μ΄ λ˜μ–΄μ„  μ•ˆλœλ‹€.
  2. λ”°λΌμ„œ, μƒλŒ€λ°©μ΄ iλ₯Ό μ‹«μ–΄ν•˜μ§€ μ•Šμ•„λ„, i번 μ‚¬λžŒμ΄ μ‹«μ–΄ν•˜λŠ” μ‚¬λžŒλ“€μ„ μž„μ˜λ‘œ i_a, i_b ... 라고 λ‚˜νƒ€λ‚΄λ©΄,
    i와 i_a, i_b... λŠ” μ„œλ‘œ μ‹«μ–΄ν•˜λŠ” κ΄€κ³„λ‘œ μ§€μ •ν–ˆλ‹€. → μ–‘λ°©ν–₯ κ·Έλž˜ν”„
  3. 1λ²ˆμ€ 무쑰건 ν°νŒ€(1)으둜 보고 dfsλ₯Ό μ‹œμž‘ν•˜μ—¬ μ—°κ²°λ˜μ–΄ μžˆλŠ” λ…Έλ“œμ— λŒ€ν•΄μ„œ λ°˜λŒ€μƒ‰κΉ”(-1)둜 μΉ ν•œλ‹€.
  4. μ΄λ ‡κ²Œ λͺ¨λ“  λ…Έλ“œμ— λŒ€ν•΄μ„œ 색깔이 λ‹€ μΉ ν•΄μ§ˆλ•ŒκΉŒμ§€ 반볡문이 μ‹€ν–‰λœλ‹€.
  5. 그리고 λ‹€μ‹œ ν•œ 번 n만큼 λ°˜λ³΅λ¬Έμ„ λŒλ©΄μ„œ 1이라면 ν°νŒ€, -1이라면 νŒŒλž€νŒ€μ— λΆ„λ₯˜ν•˜κ³ 
  6. 각각의 νŒ€μ˜ μΈμ›μˆ˜μ™€ μ†ν•œ μ‚¬λžŒλ“€μ„ 좜λ ₯ν•œλ‹€.

λ„μ›€λœ testcase

4
1 3
1 4
1 4
0

이 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ₯Ό 보고, μ²˜μŒμ—λŠ” 단방ν–₯λŒ€λ‘œ λͺ¨λ‘ μ£Όμ–΄μ§€λ‹ˆκΉŒ λ”°λ‘œ μ–‘λ°©ν–₯으둜 μ²˜λ¦¬μ•ˆν•΄μ€˜λ„ λ˜κ² λ‹€ μ‹Άμ—ˆλ‹€κ°€
iλŠ” i_aλ₯Ό μ‹«μ–΄ν•˜λŠ”λ°, i_aλŠ” iλ₯Ό μ‹«μ–΄ν•˜μ§€ μ•Šμ„ μˆ˜λ„ 있고, μ‹«μ–΄ν•˜λŠ” μ‚¬λžŒμ΄ κ·Έλƒ₯ μ—†λŠ” μ‚¬λžŒλ„ μžˆμ„ 수 있고..
κ·Έλž˜μ„œ λͺ¨λ“  κ²½μš°μ— λŒ€ν•΄μ„œ 더 μ‰½κ²Œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ μ–‘λ°©ν–₯으둜 μ €μž₯해놨닀.

 

μ½”λ“œ

λ©”λͺ¨λ¦¬ μ‹œκ°„
 1988KB  0ms
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <vector>
using namespace std;
int n, chk[105];
vector<int> white, blue, arr[105];
 
void dfs(int num, int team) {
    chk[num] = team;
    for (auto child : arr[num]) {
        if (chk[child])    continue;
        dfs(child, team * -1);
    }
}
 
int main() {
    scanf("%d"&n);
    for (int i = 1, a; i <= n; i++) {
        scanf("%d"&a);
        for (int j = 0, b; j < a; j++) {
            scanf("%d"&b);
            arr[i].push_back(b);
            arr[b].push_back(i);
        }
    }
    for (int i = 1; i <= n; i++) {
        if (!chk[i]) {
            dfs(i, 1);
        }
    }
 
    // white 1, blue -1 λ‚˜λˆ„κΈ°
    for (int i = 1; i <= n; i++) {
        if (chk[i] == 1) {
            white.push_back(i);
        }
        else {
            blue.push_back(i);
        }
    }
 
    vector<int>::iterator it;
    printf("%d\n", white.size());
    for (it = white.begin(); it != white.end(); it++) {
        printf("%d "*it);
    }
    printf("\n%d\n", blue.size());
    for (it = blue.begin(); it != blue.end(); it++) {
        printf("%d "*it);
    }
 
    return 0;
}
cs

 

λŒ“κΈ€