728x90
반응형
위상 정렬 알고리즘 (Topological Sort Algorithm)
: 방향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으면서 모든 정점을 정렬하는 알고리즘
위상 정렬 알고리즘
① 진입 차수가 0인 정점들 모두 enQueue
② 큐에서 deQueue 해서 반환받은 정점 출력
③ 출력한 정점에서 뻗어나가는 간선이 도착하는 정점의 진입 차수 -1
④ 진입 차수를 -1 해준 정점의 진입 차수가 0이 되면 enQueue
⑤ 큐가 Empty상태가 될 때까지 ② ~ ④과정 반복
더보기
결괏값 >>>
V0 - V1 - V2 - V3 - V4 - V5 - V6
의사 코드(Pseudo Code)
Topological()
Q ← createQueue();
for(Vi ← 0; Vi<n; Vi ← Vi+1) do {
if(진입차수[Vi] == 0) do {
enQueue(Vi);
}
}
while(not isEmpty(Q)) do {
v ← deQueue();
for(node : v의 진출 간선) do {
진입차수[node]--;
if(진입차수[node] == 0) do {
enQueue(node);
}
}
}
end Topological()
Java 코드 구현
public static topological() {
Queue<Integer> queue = new LinkedList<>();
StringBuilder sb = new StringBuilder();
for(int i=1; i<=n; i++)
if(iCnt[i] == 0)
queue.add(i);
int num;
while(!queue.isEmpty()) {
num = queue.remove();
sb.append(num+" ");
for(int vi : line[num])
if(--iCnt[vi] == 0)
queue.add(vi);
}
}
시간 복잡도 (Time Complexity)
= O(V+E)
* V = 정점의 수, E = 간선의 수
728x90
반응형
'알고리즘 > [JAVA_자바] 알고리즘' 카테고리의 다른 글
[알고리즘] LCS(Longest Common Subsequence, Substring) 알고리즘 - JAVA / 자바 (0) | 2022.03.26 |
---|---|
[알고리즘] 벨만-포드 알고리즘 (Bellman-Ford Algorithm) - JAVA / 자바 (0) | 2022.03.06 |
[알고리즘] 0-1 너비 우선 탐색 알고리즘 (0-1 Breath First Search Algorithm, 0-1 BFS) - JAVA / 자바 (0) | 2022.03.05 |
[알고리즘] 0-1 배낭 문제 (0-1 Knapsack Problem) - JAVA / 자바 (0) | 2022.02.27 |
[알고리즘] 다익스트라 알고리즘 (Dijkstra Algorithm) - JAVA / 자바 (0) | 2022.02.26 |