하루에 한 문제
[BOJ-1766][위상정렬] 문제집 -Java 본문
https://www.acmicpc.net/problem/1766
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분
위상 정렬을 이용해 풀 수 있다!
주의할 점은 그냥 큐를 쓰면 안 되고 우선순위 큐를 써야 한다는 점이다!
둘 다 풀 수있는 문제라면 순서가 더 빠른 문제를 풀어야 하기 때문이다!
만약 위상정렬을 잘 모른다면 이곳에서 공부할 수 있다ㅎ
끝~
'알고리즘 > 백준' 카테고리의 다른 글
[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