Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • Kubernetes
  • 프로그래머스
  • django
  • boj
  • 백트래킹
  • Network
  • BFS
  • docker
  • 다이나믹 프로그래밍
  • DFS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

Algorithm/BOJ

[백준 1043] 거짓말 (C++)

2021. 10. 24. 21:43
 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

 

재미있는 문제였다.

나는 사람과 파티를 똑같이 하나의 정점으로 보았다. 둘다 최대 50이므로 사람은 51부터, 방은 1부터 번호를 가지도록 설정했다.

 

진실 감별사부터 시작하는 dfs를 수행한다. 이때 연결되는 모든 정점은 진실 감별사로 바뀌게 된다.

 

처음 주어진 진실 감별사와 연결된 모든 정점을 진실 감별사로 바꾸고, 아직까지 진실 감별사가 되지 않은 사람의 수를 출력하면 답을 구할 수 있다.

 

처음에 Union find로 풀려고 했다가 너무 어려워졌다. 그래프를 계속 그려보면서 생각하니 dfs로 서로간의 연결만 생각해주면 되는 문제였어서 다행히 풀 수 있었다.

 

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <vector>
#define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
 
using namespace std;
 
int N, M;
vector<int> party[101];
vector<int> truemanlist;
bool trueman[101];
bool visited[101];
 
void input(){
    cin >> N >> M;
    int a, b;
    cin >> a;
    for(int i = 0; i < a; i++){
        cin >> b;
        truemanlist.push_back(b+50);
        trueman[b+50] = 1;
    }
    
    for(int i = 0; i < M; i++){
        cin >> a;
        for(int j = 0; j < a; j++){
            cin >> b;
            party[i].push_back(b + 50);
            party[b+50].push_back(i);
        }
    }
}
 
void dfs(int now){
    trueman[now] = true;
    visited[now] = true;
    
    for(int i = 0; i < party[now].size(); i++){
        int next = party[now][i];
        if(visited[next]) continue;
        dfs(next);
    }
}
 
void solve(){
    for(int i = 0; i < truemanlist.size(); i++){
        int now = truemanlist[i];
        dfs(now);
    }
    
    int ans = 0;
    for(int i = 0; i < M; i++){
        if(!trueman[i]) ans++;
    }
    
    cout << ans << "\n";
}
 
int main(){
    fastio
    input();
    solve();
    
    return 0;
}
 
 
Colored by Color Scripter
cs

 

'Algorithm > BOJ' 카테고리의 다른 글

[백준 14595] 동방 프로젝트(Large) (C++)  (0) 2021.10.29
[백준 1941] 소문난 칠공주 (C++)  (0) 2021.10.25
[백준 2616] 소형기관차 (C++)  (0) 2021.10.24
[백준 2696] 중앙값 구하기 (C++)  (0) 2021.10.24
[백준 1199] 오일러 회로(인접 리스트) (C++)  (3) 2021.10.17
    'Algorithm/BOJ' 카테고리의 다른 글
    • [백준 14595] 동방 프로젝트(Large) (C++)
    • [백준 1941] 소문난 칠공주 (C++)
    • [백준 2616] 소형기관차 (C++)
    • [백준 2696] 중앙값 구하기 (C++)

    티스토리툴바