
C->A
A<- B
A-> D 라면
각 노드별 진입차수는 다음과 같다
A B C D
2 0 0 1
진입차수가 0인 B,C를 큐에 집어넣는다.
B를 큐에서 빼면서 B와 연결된 정점 A의 차수를 빼준다.
1 0 0 1
C를 큐에서 빼면서 C와 연결된 A의 차수를 빼준다
0 0 0 1
진입차수가 0이된 A를 큐에 넣는다
A를 빼면서 A가바라보는 선행정점인 D의 차수를 빼준다
0 0 0 0
D를 큐에 집어넣어 준다
D를 큐에서 뺀다
D에서 나가는 간선이 없다
탐색이 끝남.
모든 노드가 방문처리 되었음으로 이 리스트는 사이클이 발생하지 않았음으로
위상정렬이 완료되었다.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N,M;
static ArrayList<Integer>[] list;
static int[] inDegree; // 진입차수 배열
static ArrayList<Integer> answer = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
list = new ArrayList[N];
inDegree = new int[N];
for(int i=0; i<N; i++)
{
list[i] = new ArrayList<Integer>();
}
for(int i =0; i<M; i++)
{
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken())-1;
int to = Integer.parseInt(st.nextToken())-1;
list[from].add(to);
++inDegree[to];
}
ArrayList<Integer> orderList = topologySort();
// System.out.println(Arrays.toString(inDegree));
for(int i=0; i<orderList.size(); i++)
{
System.out.print(orderList.get(i)+" ");
}
}
private static ArrayList<Integer> topologySort()
{
ArrayList<Integer> orderList = new ArrayList<>();
Queue<Integer> queue = new ArrayDeque<>();
for(int i=0; i<N; i++)
{
if(inDegree[i] ==0) queue.offer(i); // 차수가 0인 애들을 큐에 집어넣는다
}
while(!queue.isEmpty()) // 만약 큐가 비어있지 않다면
{
int current = queue.poll(); // 입차수가 0인 노드를 하나 꺼내옴
orderList.add(current+1); // 정답에 포함시킨다
//뽑은 노드와 연결된 리스트의 진입차수를 하나 빼준다
for(Object obj : list[current])
{
Integer next = (Integer) obj;
inDegree[next] -=1;
if(inDegree[next] == 0)
queue.offer(next);
}
}
return orderList;
}
}