길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Graph

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

2022. 6. 3. 23:41

https://www.acmicpc.net/problem/1043

 

1043번: 거짓말

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

www.acmicpc.net


거짓말 문제는 그래프를 이용하여 해결할 수 있습니다.

 

  1. 파티에서 거짓말을 하려면 해당 파티에 오는 사람들은 모두 진실을 알지 못해야합니다.
  2. 진실을 아는 사람이 존재하지 않는다면, 모든 파티에서 과장을 할 수 있습니다.
  3. A는 진실을 아는 사람, B는 진실을 아는 사람과 같이 파티에 참석한 사람일 때, B가 참석한 파티에서도 거짓말을 할 수 없습니다. 
    1. 먼저, B와 파티에서 거짓말을 한 경우, A와의 파티에서 진실을 말해야하기 때문에 거짓말쟁이가 됩니다.
    2. 먼저, A와의 파티에서 진실을 말한 경우, B와의 파티에서 거짓말을 하면 거짓말쟁이가 됩니다. 
2 2
1 A
2 A B
2 B

이와 마찬가지로, B와 같이 파티에 참석한 사람이 참석한 파티에서도 거짓말을 할 수 없습니다. 

 

이를 이용하여, 진실을 아는 사람과 연결된 사람들이 참석한 모든 파티에서는 거짓말을 할 수 없습니다. 

 

아래는 전체 코드입니다. 

#include <bits/stdc++.h>
using namespace std;

int vis[51];

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m; cin >> n >> m;    // 사람 수와 파티의 수 입력 받음
    int tn; cin >> tn; 

    vector<vector<int>> party(m);   // 각 파티에 참석하는 사람
    vector<vector<int>> linked(n + 1); 
    vector<int> t(tn); // 진실을 아는 사람들
    
    for(int i = 0; i < tn; i++) cin >> t[i];   // 진실을 아는 사람들 입력 받음

    for(int i = 0; i < m; i++){
        int c; cin >> c; 
        vector<int> participant(c); // i번째 파티에 참석하는 사람들

        for(int j = 0; j < c; j++) cin >> participant[j];   // i번째 파티에 참석하는 사람들 입력 받음
        party[i] = participant;
        
        for(int j = 0; j < c - 1; j++){ // 같은 파티에 참석한 사람들을 연결
            int u = participant[j], v = participant[j + 1]; 
            linked[u].push_back(v);
            linked[v].push_back(u);
        }
    }

    for(int i = 0; i < t.size(); i++){  // 진실을 아는 사람을 시작점으로 하여 BFS 수행
        int st = t[i];
        queue<int> q;
        q.push(st);
        vis[st] = 1;

        while(!q.empty()){
            int cur = q.front(); q.pop();
            for(auto nxt : linked[cur]){
                if(vis[nxt] != 0) continue;
                q.push(nxt);
                vis[nxt] = 1;
            }
        }
    }

    int ans = 0;
    for(int i = 0; i < m; i++){
        bool avail = true;
        for(int j = 0; j < party[i].size(); j++){   // 파티에 참석한 인원들이 모두 진실을 아는 사람들과 관련이 없는 경우에만 거짓말을 할 수 있음
            if(vis[party[i][j]] != 0) avail = false;
        }
        if(avail) ans++;
    }

    cout << ans << "\n";
}

 

 

 

 

 

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

[백준 2617번] 구슬 찾기 (C++)  (0) 2022.06.03
[백준 1707번] 이분 그래프 (C++)  (0) 2022.06.03
    'Algorithm/Graph' 카테고리의 다른 글
    • [백준 2617번] 구슬 찾기 (C++)
    • [백준 1707번] 이분 그래프 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바