[BOJ알고리즘, C++]#2056_작업, 위상 정렬, 비순환 유향 그래프, DAG

2024. 2. 20. 23:14· 문제 풀이/BOJ 문제 풀이
목차
  1. #1. 문제
  2. #2. 풀이
  3. 1. 위상 정렬
  4. 2. 위상 정렬과 더불어 이에 걸리는 최소 시간 등의 문제가 많이 나온다!
  5. #3. 코드

 

#1. 문제

 

2056번: 작업

수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해

www.acmicpc.net

 


 

#2. 풀이

 

1. 위상 정렬

 

[자료구조]#6_그래프

#0. 개념 1. 그래프? [정의] : 그래프는 노드와 간선들의 집합으로 이루어진 비 선형 자료구조입니다. 그래프의 노드들은 간선을 통해 연결되어 일종의 네트워크를 형성합니다. 그래프는 노드와

webddevys.tistory.com

 

위상 정렬은 비순환 유향 그래프에서 각 정점의 선행 관계를 유지하며 정점들을 나열하는 방법입니다. 일반적으로, 위상 정렬은 DFS와 진입차수 BFS를 활용하여 구현합니다.

 

2. 위상 정렬과 더불어 이에 걸리는 최소 시간 등의 문제가 많이 나온다!

 

  1. 단순히, 선행 관계를 유지하며 나열하는 방법은 위상 정렬 알고리즘을 활용하면 됩니다.
  2. 이때, 선행 관계를 유지하여 나열하였을 경우, 각 정점에 작업 처리 시간 등이 주어지며, 모든 작업을 처리하기 위해 걸리는 최소 시간을 구하는 등의 추가 조건이 붙는 문제가 많다.
  3. 각 정점의 작업 처리 시작 시간 혹은 끝나는 시간 등을 기억하는 별도의 vector 컨테이너를 선언합니다.
  4. 위상 정렬 알고리즘에서, 현재 정점의 인접 정점들을 차례대로 순회합니다. 이때, 인접 정점의 작업 시작 시간과 현재 정점의 작업이 끝난 시간을 비교하여, 이를 최대 값으로 갱신하는 코드를 추가적으로 작성해 줍니다.
  5. 결과적으로, BFS를 수행하는 과정에서 "현재 정점"과 관련된 값을 통해 "인접 정점"과 관련된 값을 경신해 주며, 마지막에 갱신된 값을 찾아주면 됩니다!

 


 

#3. 코드

 

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

int N;
vector<vector<int>> graph;
vector<int> time, InDegree;
int maxFinishTime = INT_MIN;

int TopologicalSort()
{
    queue<int> q;
    vector<int> startTime(N + 1, 0);

    for (int i = 1; i <= N; ++i)
    {
        if (InDegree[i] == 0)
            q.push(i);
    }

    while (!q.empty())
    {
        int cur = q.front();
        q.pop();

        // 작업 종료 시간
        time[cur] += startTime[cur];
        if (maxFinishTime < time[cur])
            maxFinishTime = time[cur];

        for (const auto &neighbor : graph[cur])
        {
            InDegree[neighbor]--;
            startTime[neighbor] = max(startTime[neighbor], time[cur]);

            if (InDegree[neighbor] == 0)
            {
                q.push(neighbor);
            }
        }
    }

    return maxFinishTime;
}

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

    cin >> N;

    graph.resize(N + 1);
    time.resize(N + 1, 0);
    InDegree.resize(N + 1, 0);

    for (int from = 1; from <= N; ++from)
    {
        cin >> time[from];

        int num;
        cin >> num;

        while (num--)
        {
            int to;
            cin >> to;

            graph[from].push_back(to);
            InDegree[to]++;
        }
    }

    cout << TopologicalSort();

    return 0;
}

 


 

 

 

 

저작자표시 (새창열림)

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

[BOJ알고리즘, C++]#2178_미로 탐색, 그래프, BFS, DFS  (0) 2024.02.21
[BOJ알고리즘, C++]#14567_선수 과목(Prerequisite), 위상 정렬, 비순환 유향 그래프, DAG  (0) 2024.02.21
[BOJ알고리즘, C++]#1766_문제집, 위상 정렬, 그래프  (0) 2024.02.20
[BOJ알고리즘, C++]#11657_타임 머신, 길 찾기, 최단 경로 알고리즘, 벨만-포드, 음수 가중치, 음수 사이클  (1) 2024.02.06
[BOJ알고리즘, C++]#1865_웜홀, 최다 경로 알고리즘, 길 찾기 알고리즘, 벨만-포드 알고리즘  (0) 2024.02.06
  1. #1. 문제
  2. #2. 풀이
  3. 1. 위상 정렬
  4. 2. 위상 정렬과 더불어 이에 걸리는 최소 시간 등의 문제가 많이 나온다!
  5. #3. 코드
'문제 풀이/BOJ 문제 풀이' 카테고리의 다른 글
  • [BOJ알고리즘, C++]#2178_미로 탐색, 그래프, BFS, DFS
  • [BOJ알고리즘, C++]#14567_선수 과목(Prerequisite), 위상 정렬, 비순환 유향 그래프, DAG
  • [BOJ알고리즘, C++]#1766_문제집, 위상 정렬, 그래프
  • [BOJ알고리즘, C++]#11657_타임 머신, 길 찾기, 최단 경로 알고리즘, 벨만-포드, 음수 가중치, 음수 사이클
Hardii2
Hardii2
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

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

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[BOJ알고리즘, C++]#2056_작업, 위상 정렬, 비순환 유향 그래프, DAG
상단으로

티스토리툴바

개인정보

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

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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