[C++] 백준/Silver/1325. 효율적인 해킹

2025. 2. 20. 21:04·C++/Coding Test

문제: 효율적인 해킹 (백준 1325번)

문제 분석

N개의 컴퓨터와 M개의 신뢰 관계가 주어질 때, 한 컴퓨터를 해킹하면 그 컴퓨터를 신뢰하는 다른 컴퓨터들도 해킹할 수 있다.
각 컴퓨터를 시작점으로 하여 해킹할 수 있는 컴퓨터의 수(직접 및 간접)를 구한 뒤, 가장 많은 컴퓨터를 해킹할 수 있는 노드를 출력하는 문제이다.

 

접근
입력으로 주어지는 (a, b) 관계는 "a가 b를 신뢰한다"는 의미이므로,
b를 해킹하면 a도 해킹할 수 있다.
이를 위해, 각 노드에 대해 역방향 그래프를 구성하여, 해당 노드에서 출발해 도달할 수 있는 노드의 수를 구하면 된다.


해결 방법

그래프 구성:

  • 입력 (a, b)를 받으면, graph[b]에 a를 추가한다.
    → 이렇게 하면 b를 해킹했을 때, a로 확산되는 효과를 모사할 수 있다.

BFS 탐색:

  • 각 노드 i(1 ≤ i ≤ N)에 대해 BFS를 수행하여,
    i를 시작점으로 해킹할 수 있는 컴퓨터의 수를 구한다.
  • 방문 여부를 기록하여 중복 방문을 방지한다.

최대 해킹 가능 수:

  • 모든 노드에 대해 해킹 가능 컴퓨터의 수를 구한 후,
    최대 값(maxCnt)을 갱신한다.
  • 이후 최대 해킹 가능 수를 가진 노드들을 출력한다.

코드 전체

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

int main() {
    ios::sync_with_stdio(0); 
    cin.tie(0);
    
    int n, m; 
    cin >> n >> m;
    // 역방향 그래프: graph[b]에 a를 저장 (a가 b를 신뢰)
    vector<vector<int>> graph(n + 1);
    for (int i = 0; i < m; i++) {
        int a, b; 
        cin >> a >> b;
        graph[b].push_back(a);
    }
    
    vector<int> result(n + 1); // 각 노드에서 해킹 가능한 컴퓨터 수
    int maxCnt = 0;
    
    // 모든 컴퓨터를 시작점으로 BFS 실행
    for (int i = 1; i <= n; i++) {
        vector<bool> visited(n + 1, false);
        queue<int> bfs;
        bfs.push(i);
        visited[i] = true;
        int count = 0;
        
        while (!bfs.empty()) {
            int node = bfs.front();
            bfs.pop();
            count++;
            for (const int& next : graph[node]) {
                if (visited[next]) continue;
                visited[next] = true;
                bfs.push(next);
            }
        }
        result[i] = count;
        maxCnt = max(maxCnt, count);
    }
    
    // 최대 해킹 가능한 컴퓨터 수를 가진 모든 노드 출력
    for (int i = 1; i <= n; i++) {
        if (result[i] == maxCnt)
            cout << i << ' ';
    }
    
    return 0;
}

 

'C++ > Coding Test' 카테고리의 다른 글

[C++] 백준/Gold/1005. ACM Craft  (0) 2025.02.25
[C++] 백준/Gold/14890. 경사로  (0) 2025.02.24
[C++] 백준/Gold/12852. 1로 만들기 2  (0) 2025.02.19
[C++] 백준/Silver/6588. 골드바흐의 추측  (0) 2025.02.18
[C++] 백준/Gold/9205. 맥주 마시면서 걸어가기  (1) 2025.02.17
'C++/Coding Test' 카테고리의 다른 글
  • [C++] 백준/Gold/1005. ACM Craft
  • [C++] 백준/Gold/14890. 경사로
  • [C++] 백준/Gold/12852. 1로 만들기 2
  • [C++] 백준/Silver/6588. 골드바흐의 추측
돼지표
돼지표
https://github.com/wkdgns135
  • 돼지표
    돼지표 개발 스토리
    돼지표
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • C++ (60)
        • Coding Test (53)
        • Study (1)
      • Python (1)
      • Machine Learning (2)
      • Computer Graphics (4)
        • Curly Hair Simulation (2)
      • GPU Programming (11)
        • CUDA basic (7)
        • CUDA fluidsGL (4)
      • Unreal 5 (21)
        • Troubleshooting (4)
        • FPS Shooting (5)
        • Study (10)
        • EOS (1)
      • Computer Science (7)
        • Algorithm (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    UE5
    CUDA
    FPS
    정렬
    구현
    그래프 탐색
    Algorithm
    GPU Programming
    unreal 5
    Fluid Simulation
    수학
    아이작 맵 생성
    C++
    BFS
    CS
    OpenGL
    Rendering Pipeline
    dp
    위상 정렬
    자료 구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
돼지표
[C++] 백준/Silver/1325. 효율적인 해킹
상단으로

티스토리툴바