반응형
위상정렬 (Topological Sort)의 대표적인 문제
위상정렬을 안다면 쉽게 풀 수 있는 문제
indegree 방식으로 문제 해결
풀이
1. 값을 저장해준다. List를 이용하여. (ArrayList 든 LinkedList든 상관 없뜸)
2. indegree가 0인 값을 큐에 모두 집어 넣는다.
3. 큐가 빌때까지 0인 값을 하나씩 빼서 그 다음 값을 다시 큐에 집어 넣는다. (단 그때 화살표 값인 Indegree를 하나씩 줄인다.)
4. 끝
소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import java.io.FileInputStream; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(new FileInputStream("input.txt")); int N = sc.nextInt(); int M = sc.nextInt(); int[] indegree = new int[N+1]; ArrayList<Integer>[] list = new ArrayList[N+1]; for(int i=1; i<=N; i++){ list[i] = new ArrayList<Integer>(); } for(int i=0; i<M; i++){ int x = sc.nextInt(); int y = sc.nextInt(); list[x].add(y); indegree[y]++; } //-----------입력 부---------------------- //Topological Sorting Queue<Integer> queue = new LinkedList<Integer>(); //indegree가 0일때 큐에 넣는다. indegree는 자신을 가르키고 있는 화살표의 개수 for(int i=1; i<=N; i++){ if(indegree[i]==0){ queue.add(i); } } while(!queue.isEmpty()){ System.out.println(queue.peek()); int current = queue.poll(); //자신이 가르키고 있는 좌표들을 방문하여 indegree값을 -1 해주고 만약 0이라면 큐에 넣어준다. for(int i=0; i<list[current].size(); i++){ int next = list[current].get(i); indegree[next]--; if(indegree[next]==0){ queue.add(next); } } } } } | cs |
반응형
'나는요 공부가 좋....은걸... > 알고리즈음' 카테고리의 다른 글
[BOJ] 백준 2668 - 숫자고르기 (자바) (0) | 2018.02.07 |
---|---|
[BOJ] 백준 1516 - 게임 개발 (자바) (0) | 2018.02.06 |
[BOJ] 백준 1766- 문제집 (자바) (0) | 2018.02.06 |
[BOJ] 백준 1267 - 핸드폰 요금 (자바) (0) | 2018.02.05 |
[BOJ] 백준 1697 - 숨바꼭질 (자바) (0) | 2018.02.05 |