1. 위상 정렬
① 비순환 방향 그래프 (공정이랑 비슷하네)
- 방향 그래프이면서 사이클이 없는 그래프
② 위상 정렬
- 처리해야 할 여러가지 일들이 있고, 이들 사이의 선후 관계가 있으면 이를 유향 그래프로 표현 가능
- 유향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으면서 모든 정점을 나열하는 것
- 정렬의 순서는 유향 그래프의 구조에 따라 여러 개의 종류가 나올 수 있음
- 위상 정렬은 사이클이 있어서는 안됨
- 위상 정렬 알고리즘이란? 순서가 정해져있는 작업을 차례로 수행해야 할 때
그 순서를 결정해주기 위해 사용하는 알고리즘
- ex) 대학의 선수과목 => 각 업무를 수행하기 위한 순서를 제공!
- 조건 : 사이클이 없는 유향 그래프
- 진입 간선 : 유향 그래프에서 한 정점으로 들어오는 간선
- 진출 간선 : 유향 그래프에서 한 정점에서 나가는 간선
2. 위상 정렬 알고리즘
① 위상 정렬 알고리즘 1의 작동 예
- 진입 간선이 없는 정점은 냄비에 물 붓기와 라면봉지 뜯기
- 이 중 임의의 냄비에 물 붓기를 선택하고 이 정점과 진출 간선을 모두 제거
- 이제 점화와 라면봉지 뜯기가 진입 간선이 없음
- 점화 선택 후 정점과 진출 간선 제거 -> 진입간선이 없는 정점은 라면 봉지 뜯기
- 라면봉지 뜯기를 선택하고 이 정점과 진출 간선 모두 제거 -> 진입 간선이 없는 정점은 라면 넣기와 수프 넣기
- 리면 넣기 선택하고 이 정점과 진출간선 모두 제거 -> 진입 간선이 없는 정점은 수프 넣기.
- 스프 넣기-> 이 정점과 진출 간선 모두 제거 -> 계란 풀어넣기 하나 남고, 진입간선 X
- 정점이 제거되는 순서가 하나의 위상 정렬을 이룸
3. 위상 정렬 알고리즘의 적용
① 위상 정렬 알고리즘2
- 깊이 우선 탐색(DFS)을 이용한 알고리즘이며 1보다 더 많이 쓰임.
- DFS를 거의 그래도 이용하면서 약간의 요수만 더 추가되어 알고리즘2가 더 구현하기 간단.
- DFS와 다른 점은 함수의 맨 끝에 작업이 끝난 정점을 연결 리스트로 관리하는 부
② 위상 정렬 알고리즘 2의 작동 예
- DFS-TS를 위해 아무 정점이나 선택
- 수프 넣기를 시작 정점으로 하여 DFS-TS를 시작
- 계란 풀어넣기 방문 => 여기서 할 일 더 없으므로 완료 => 연결 리스트에 계란 풀어넣기 삽입
- 스프넣기 정점으로 되돌아옴(백트래킹) => 스프넣기에도 할 일 더 없으므로 연결리스트에 삽입
- 스프 넣기 시작 정점으로 한 DFS-TS 종료
- 방문하지 않은 정점 중 하나를 임의로 선택하여 DFS-TS를 다시 시작
- 냄비에 물 붓기 정점이 시작 정점으로 선택 => 점화 방문 => 라면넣기 방문
- 라면넣기 정점에서 더 할 일 없으므로 연결 리스트에 삽입 => 점화 연결리스트에 삽입
=> 냄비에 물 붓기 연결리스트에 삽입 => 냄비에 물붓기 정점으로 한 DFS-TS 종료
- 남은 정점 연결리스트에 삽입하고 완료됨.
- 최종 연결 리스트는 역순으로 저장되어 있음.
③ 작동 원리
- 위상정렬은 숫자들을 크기순으로 정렬하는 것이 아니라 유향 그래프의 정점을 정렬함
- 위상 정렬이 필요한 경우는 그래프에서 반드시 자신보다 선행되어야 할 일을
다 끝내야만 작업에 들어갈 수 있는 조건 주어질 때이다.
'CS공부 > 학점은행_알고리즘' 카테고리의 다른 글
12-1 다익스트라 알고리즘 (1) | 2023.09.05 |
---|---|
11-2 최단 경로 문제 (0) | 2023.08.30 |
10-2 최소 신장 트리 (0) | 2023.08.23 |
10-1 트리 탐색 (0) | 2023.08.23 |
9-2 오일러 사이클과 해밀턴 사이클 (0) | 2023.08.15 |