본문 바로가기
PS 문제 풀이/SWEA

[SWEA] 1267 작업순서

by 까망 하르방 2021. 5. 16.
반응형

출처: SWEA

Approach

선행 조건이 있으면 사이클이 존재하지 않는다고 명시되어 있다.

이는 위상정렬을 구현하는 문제이다.

위상정렬 (Topological sort) 

 

위상정렬 (Topological sort)

개념 DAG에서 의존성에 맞게 그래프의 정점을 정렬 DAG (Directed Acyclic graph) 간선에 방향이 존재하고, 사이클(cycle)이 없는 그래프. DAG는 노드간의 의존성을 나타내는데, 작업 간의 순서를 표현하는

zoosso.tistory.com

 

코드에서는 DFS할 때, 후속 작업이면서 아직 방문하지 않은 정점을 DFS 탐색하고

아직 처리되지 않은 선행 정점(작업)이 존재하는 경우 분기한정 처리하였다.

DFS (depth-first search, 깊이 우선 탐색) 

 

깊이 우선 탐색(depth-first search, DFS)

DFS 그래프의 모든  정점을 방문할 때 최대한 깊숙히 정점을 방문하는 방식입니다. - Stack 이용 즉, 연결된 정점을 따라 계속 순회하다가 갈 곳이 없어지며 바로 이전단계로 가는 백트래킹 방식.

zoosso.tistory.com

 

그래프 구조를 인접행렬로 간단히 표현하였다.

그래프  정의 및 구현 방식 (인접 행렬 & 인접 리스트) 

 

그래프 정의 및 구현 방식 (인접 행렬 & 인접 리스트)

그래프는 G(V, E)는 어떤 자료나 개념을 표현하는 정점(vertex)들의 집합 V와 정점을 연결하는 간선(edge)들의 집합 E로 구성된 자료 구조로 객체들의 상호 관계를 표현하기 위해 고안된 자료 구조입

zoosso.tistory.com


#include <stdio.h>

const int MAX_V = 1e3 + 5;
int vertex, edge, from, to;
bool map[MAX_V][MAX_V];
int visited[MAX_V];

void init()
{
    for (int i = 0; i <= MAX_V; i++)
    {
        visited[i] = 0;
        for (int j = 0; j <= MAX_V; j++)
        {
            map[i][j] = 0;
        }
    }
}

void DFS(int v)
{
    // 이미 방문한 경우
    if (visited[v]) return;
    for (int i = 1; i <= vertex; ++i)
    {
        // 선행 정점들이, 아직 처리(방문)하지 않은 경우
        // 모든 선행 노드가 처리되어 있어야 한다.
        if (!visited[i] && map[i][v] == 1) return;
    }
    // 방문 표시
    visited[v] = 1;
    printf("%d ", v);
    // 현재 노드 v에서 연결된 다른 노드 탐색
    for (int i = 1; i <= vertex; i++)
    {
        // 아직 방문하지 않으면서 후행 노드인 경우
        if (!visited[i] && map[v][i] == 1)
        {
            DFS(i);
        }
    }
}

int main()
{
    // freopen("input.txt", "r", stdin);
    for (int tc = 1; tc <= 10; tc++)
    {
        init(); // 각 TC 초기화
        scanf("%d %d", &vertex, &edge); // 정점, 간선 개수
        for (int i = 0; i < edge; i++)
        {
            scanf("%d %d", &from, &to); // from -> to
            map[from][to] = 1; // 간선 표시 (인접 행렬)
        }
        // 정답 출력
        printf("#%d ", tc);
        for (int i = 1; i <= vertex; i++)
        {
            if (!visited[i]) DFS(i);
        }
        printf("\n");
    }
    return 0;
}

 

반응형

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

[SWEA] 3421 수제 버거 장인  (0) 2021.05.16
[SWEA] 4411 덕환이의 카드 뽑기  (0) 2021.05.16
[SWEA] 10204 초밥 식사  (0) 2021.05.16
[SWEA] 3238 이항계수 구하기  (0) 2021.05.16
[SWEA] 1232 사칙연산  (0) 2021.05.15

댓글