하루에 한 문제
[BOJ-1766][위상정렬] 문제집 -Java 본문
https://www.acmicpc.net/problem/1766
1766번: 문제집
첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주
www.acmicpc.net
package BOJ_위상정렬;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class boj_1766_문제집 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine());
int N=Integer.parseInt(st.nextToken());
int M=Integer.parseInt(st.nextToken());
int []weight=new int[N+1];
boolean[] visited = new boolean[N+1];
List<Integer> list[]=new List[N+1];
List<Integer> result=new ArrayList<>();
PriorityQueue<Integer> node = new PriorityQueue<>();
for(int i=0; i<=N; i++) {
list[i]=new ArrayList<>();
}
for(int i=0; i<M; i++) {
st= new StringTokenizer(br.readLine());
int start=Integer.parseInt(st.nextToken());
int end=Integer.parseInt(st.nextToken());
list[start].add(end);
weight[end]++;
}
for(int i=1; i<=N; i++) { //진입이 0인 숫자 찾기
if(weight[i]==0) {
node.add(i);
}
}
while(!node.isEmpty()) {
int size=node.size();
for(int i=0; i<size; i++) {
int cur=node.poll();
result.add(cur); //순서
//n과 연결된 간선 모두 끊어주고
for(int j=0; j<list[cur].size(); j++) {
int next=list[cur].get(j);
if(--weight[next]==0) node.add(next);
}
}
}
for(int num:result) {
System.out.print(num+" ");
}
}
}
소요시간 : 30분
위상 정렬을 이용해 풀 수 있다!
주의할 점은 그냥 큐를 쓰면 안 되고 우선순위 큐를 써야 한다는 점이다!
둘 다 풀 수있는 문제라면 순서가 더 빠른 문제를 풀어야 하기 때문이다!
만약 위상정렬을 잘 모른다면 이곳에서 공부할 수 있다ㅎ
위상정렬
위상정렬이란? 순서가 정해져 있는 작업을 차례로 수행해야 할 때, 그 순서를 결정해주는 알고리즘이다. 다음과 같은 그래프에서 앞선 작업 2,3이 끝나야 뒤 작업 4가 이루어질 수 있다. 이 때 둘
dkwjdi.tistory.com
끝~
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ-2630][분할정복] 색종이 만들기 -Java (0) | 2021.04.04 |
---|---|
[BOJ-3020][이분탐색] 개똥벌레 -Java (0) | 2021.04.03 |
[BOJ-2002][구현]추월 -Java (0) | 2021.04.02 |
[BOJ-1747][문자열] 소수&팰린드롬 -Java (0) | 2021.04.02 |
[BOJ-14500]테트로미노 -Java (4) | 2021.04.01 |
Comments