쾌락없는 책임 (공부)/알고리즘 문제풀이

백준 10282 해킹 - C++, 다익스트라

허스크 2021. 6. 6. 19:39
반응형
 

10282번: 해킹

최흉최악의 해커 yum3이 네트워크 시설의 한 컴퓨터를 해킹했다! 이제 서로에 의존하는 컴퓨터들은 점차 하나둘 전염되기 시작한다. 어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면

www.acmicpc.net

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#define MAX 999999999
using namespace std;

int t; //테스트케이스 수
int n, d, c; // 컴퓨터 수, 의존성 수(경로수), 해킹당한 컴퓨터
int a, b, s; // a,b 컴퓨터, s 시간
int cur, time, nextCur, nextTime;
int comCount, infectTime;
int com[10001];
priority_queue<pair<int, int> > djikQ;

int main(){
    scanf("%d", &t);
    while(t--){
        // 선언 및 초기화
        vector<vector<pair<int, int> > > depend;

        // 입력
        scanf("%d %d %d", &n, &d, &c);

        depend.resize(n+1);

        for(int i = 0; i < d; i++){
            scanf("%d %d %d", &a, &b, &s);
            depend[b].push_back(make_pair(a, s));
        }

        // 배열 초기화
        for(int i = 0; i <= n; i++){
            com[i] = MAX;
        }

        // 다익스트라로 탐색
        djikQ.push(make_pair(0, c));
        com[c] = 0;
        int time;

        while (!djikQ.empty()){
            cur = djikQ.top().second;
            time = -djikQ.top().first;
            djikQ.pop();

            if(time > com[cur])
                continue;

            for(int i = 0; i < depend[cur].size(); i++){
                nextCur = depend[cur][i].first;
                nextTime = depend[cur][i].second + time;

                if(com[nextCur] > nextTime){
                    com[nextCur] = nextTime;
                    djikQ.push(make_pair(-com[nextCur], nextCur));
                }
            }
        }

        // 결과
        comCount = 0,
        infectTime = 0;

        for(int i = 1; i <= n; i++){
            if(com[i] != MAX){
                comCount++;
                infectTime = max(com[i], infectTime);
            }
        }

        printf("%d %d\n", comCount, infectTime);
        
    }
}

 간단한 다익스트라 문제였는데 막상 풀때는 헤메서 오래 걸린 문제입니다. 기존 풀던 다익스트라 문제들은 from, to가 들어오는 순서대로 넣었지만 이번 문제같은 경우 to, from으로 넣어줘야 영향을 받는지 체크할 수 있습니다. 테스트케이스중 from to 순서와 상관없이 답이 같은 경우가 있어 시간을 잡아먹게 되었습니다.

반응형