[BOJ알고리즘, C++]#10282_해킹, 길 찾기 알고리즘, 최단 경로 알고리즘, 다익스트라

2024. 5. 6. 18:30· 문제 풀이/BOJ 문제 풀이
목차
  1.  
  2. #1. 문제
  3. #2. 풀이
  4. 2. 감염에 걸리는 시간을 '가중치'로 보자!
  5. #3. 코드

 

#1. 문제

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

 


 

#2. 풀이

 

1. 다익스트라

 

[알고리즘]#2_길 찾기 알고리즘

#1. 개념 1. 길 찾기 알고리즘[정의] : 길 찾기 알고리즘은 그래프 자료구조에서 출발점에서 도착점 사이의 경로를 탐색하는 알고리즘입..

webddevys.tistory.com

다익스트라 알고리즘은 양의 가중치를 갖는 그래프에서 '단일 출발 최단 경로'를 구하는 길 찾기 알고리즘입니다. 일반적으로, 다익스트라 알고리즘은 하나의 출발 정점에 대하여 다른 모든 정점을 도착 정점으로 하는 최단 경로를 찾는 알고리즘으로, 우선순위 큐와 최단 경로 목록을 활용합니다. 주의할 점은 간선의 방향성 여부에 따라서 중복 업데이트 방지를 위해 각 정점의 방문 여부를 기록할 것인지 고려해야 합니다!

 

2. 감염에 걸리는 시간을 '가중치'로 보자!

  1. 어떤 한 컴퓨터의 감염 시작 시간은 의존성이 있는 컴퓨터들 중 가장 먼저 감염이 시작된 컴퓨터로부터 영향을 받습니다. 따라서, 입력으로 주어진 '해킹당한 컴퓨터'를 출발 정점으로 다익스트라를 수행하며 마지막 컴퓨터가 감염되기까지 걸린 시간(최단 경로 값 중 최대 값을 갖는 정점)을 찾습니다!
  2. 다익스트라를 정의합니다. 이 과정에서 최단 경로 값의 최대 값을 지속적으로 업데이트해줍니다.
  3. 마지막으로, 최단 경로 값이 최대가 되는 정점과 그 값을 결과로 출력합니다.

 


 

#3. 코드

 

/*
    @문제 : 감염된 컴퓨터를 시작으로 전여된 총 컴퓨터 갯수와 마지막 컴퓨터가 감염되기 까지 걸린 시간
    @설명
            1. 단순히, bfs를 수행하며 마지막 컴퓨터가 감염되기 까지 걸린 시간을 찾으려고 했으나, 문제를 이해 못했다.
            2. 여러 컴퓨터에 의존성을 갖는 어떤 컴퓨터가 이미 '감염'된 순간부터, 더 이상 감염 피해를 받을 수 없다. 따라서, 해당 컴퓨터까지 "
            최단 경로", 즉 제일 빨리 감염시키는 루트를 찾는 것이다!
            3. 결국, BFS 대신 다익스트라를 활용했다.
*/

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;

#define MAX 10001
typedef pair<int,int> p;

int T, n ,d, c;

void dijkstra(int start, vector<vector<p>>& graph)
{
    vector<int> infectedTime(n+1, INT_MAX);
    priority_queue<p, vector<p>, greater<p>> pq;
    int cnt = 0;
    int maxTime = 0;

    infectedTime[start] = 0;
    pq.push({0, start});

    while(!pq.empty())
    {
        int curTime = pq.top().first;
        int cur = pq.top().second;
        pq.pop();

        if(infectedTime[cur] < curTime) continue;

        cnt++;
        maxTime = max(maxTime, curTime);

        for(const auto& edge : graph[cur])
        {
            int next = edge.first;
            int newTime = curTime + edge.second;

            if(infectedTime[next] > newTime)
            {
                infectedTime[next] = newTime;
                pq.push({newTime, next});
            }
        }
    }

    cout << cnt << ' ' << maxTime << '\n';

}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> T;

    while(T--)
    {
        cin >> n >> d >> c;

        vector<vector<p>> graph(n+1);
        
        while(d--)
        {
            int a, b, s;
            cin >> a >> b >> s;

            graph[b].push_back({a,s});
        }

        // 다익스트라
        dijkstra(c, graph);

    }

    return 0;
}

 


 

 

 

 

저작자표시 (새창열림)

'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ알고리즘, C++]#1761_정점들의 거리, LCA, LCA 최단/최장 거리 찾기  (0) 2024.05.06
[BOJ알고리즘, C++]#1240_노드 사이의 거리, 최단 경로 알고리즘, BFS  (0) 2024.05.06
[BOJ알고리즘, C++]#6603_로또, DFS, 백트래킹, 순열 백트래킹  (0) 2024.04.30
[BOJ알고리즘, C++]#16398_행성 연결, 최소 신장 트리, 크루스칼, Kruskal  (0) 2024.04.17
[BOJ알고리즘, C++]#2887_행성 터널, 최소 신장 트리(MST), 크루스칼  (0) 2024.04.08
  1.  
  2. #1. 문제
  3. #2. 풀이
  4. 2. 감염에 걸리는 시간을 '가중치'로 보자!
  5. #3. 코드
'문제 풀이/BOJ 문제 풀이' 카테고리의 다른 글
  • [BOJ알고리즘, C++]#1761_정점들의 거리, LCA, LCA 최단/최장 거리 찾기
  • [BOJ알고리즘, C++]#1240_노드 사이의 거리, 최단 경로 알고리즘, BFS
  • [BOJ알고리즘, C++]#6603_로또, DFS, 백트래킹, 순열 백트래킹
  • [BOJ알고리즘, C++]#16398_행성 연결, 최소 신장 트리, 크루스칼, Kruskal
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • unreal
  • BOJ
  • 디자인 패턴
  • dfs
  • 개발
  • DP
  • BFS
  • 알고리즘
  • Unreal Blueprint
  • programmers
  • 기술 질문
  • C++
  • Effective C++
  • stl
  • set
  • 우선순위 큐
  • 정렬
  • 트리
  • 그래프
  • 최단 경로

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[BOJ알고리즘, C++]#10282_해킹, 길 찾기 알고리즘, 최단 경로 알고리즘, 다익스트라
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.