알고리즘105 :: BOJ_2056_작업
위상정렬과 관련된 문제입니다.
"몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해 반드시 먼저 완료되어야 할 작업들이 있다."
앞서 수행해야 하는 작업이 우선 수행한뒤 뒤에 노드들이 수행되어야 합니다. 따라서 위상정렬 알고리즘을 활용하여 해결할 수 있습니다.
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
ArrayList<Integer>[] al = new ArrayList[n+1];
for(int i=1; i<=n; i++)
al[i] = new ArrayList<>();
//입출력 관련된 부분입니다. 그래프의 연결관계를 나타내기 위해 어레이 리스트를 사용하였습니다.
int[] work = new int[n+1];
int[] d = new int[n+1];
int[] indegree = new int[n+1];
//work 는 비용, d는 작업의 비용을 업데이트 합니다. ?작업의 비용이란 예를들어 한 노드에서
다음 노드로 가리키는 방향이 여러개라면 다음 노드는 이전 노드 모두를 수행한뒤 처리해야 하기 때문에
이 시간을 업데이트 해줄 배열 입니다.
for(int i=1; i<=n; i++) {
work[i] = sc.nextInt();
int cnt = sc.nextInt();
for(int j=0; j<cnt; j++) {
int k = sc.nextInt();
al[k].add(i);
indegree[i]++;
//k노드 다음에 i가 존재한다. 따라서 i에는 indegree를 하나 증가시켜줍니다.
}
}//end of for loop
Queue<Integer> q= new LinkedList<>();
for(int i=1; i<=n; i++) {
if(indegree[i] == 0) {
//인디그리가 0인 노드들에 대해 큐에 집어넣어 줍니다.
q.add(i);
d[i] = work[i];
//d 배열의 값을 work 각각에 대한 값으로 업데이트 합니다.
}
}//end of for loop
while(!q.isEmpty()) {
int first = q.poll();
for(int s : al[first]) {
indegree[s]--;
//간선을 끊는것을 사실상 -1 감소하는것으로 처리합니다.
if(indegree[s]==0) {
q.add(s);
}
//인디그리가 0인것을 큐에 넣습니다.
if(d[s]<d[first]+work[s])
d[s] = d[first]+work[s];
//연결된 값중에서 Q1. 어느 간선의 가중치 값이 큰지 상관없이 우선 끝나는게 중요하니까
사실상 값은 의미없는것이 아닌가?
}
}
int ans = Integer.MIN_VALUE;
for(int i=1; i<=n; i++) {
ans = Math.max(ans, d[i]);
}
System.out.println(ans);
ㅡ. 통합
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
ArrayList<Integer>[] al = new ArrayList[n+1];
for(int i=1; i<=n; i++)
al[i] = new ArrayList<>();
int[] work = new int[n+1];
int[] d = new int[n+1];
int[] indegree = new int[n+1];
for(int i=1; i<=n; i++) {
work[i] = sc.nextInt();
int cnt = sc.nextInt();
for(int j=0; j<cnt; j++) {
int k = sc.nextInt();
al[k].add(i);
indegree[i]++;
}
}//end of for loop
Queue<Integer> q= new LinkedList<>();
for(int i=1; i<=n; i++) {
if(indegree[i] == 0) {
q.add(i);
d[i] = work[i];
}
}//end of for loop
while(!q.isEmpty()) {
int first = q.poll();
for(int s : al[first]) {
indegree[s]--;
if(indegree[s]==0) {
q.add(s);
}
if(d[s]<d[first]+work[s])
d[s] = d[first]+work[s];
}
}
int ans = Integer.MIN_VALUE;
for(int i=1; i<=n; i++) {
ans = Math.max(ans, d[i]);
}
System.out.println(ans);
}
}
'알고리즘' 카테고리의 다른 글
알고리즘107 :: 투포인트 - BOJ_수들의합2 (0) | 2020.09.28 |
---|---|
알고리즘106 :: BOJ_11726_2XN타일링 (0) | 2020.09.27 |
알고리즘104 :: BOJ_1766_문제집 (0) | 2020.09.26 |
알고리즘104 :: 최소 스패닝 트리(MST) (0) | 2020.09.24 |
알고리즘102 :: KAKAO_셔틀버스 (0) | 2020.09.22 |
댓글
이 글 공유하기
다른 글
-
알고리즘107 :: 투포인트 - BOJ_수들의합2
알고리즘107 :: 투포인트 - BOJ_수들의합2
2020.09.28 -
알고리즘106 :: BOJ_11726_2XN타일링
알고리즘106 :: BOJ_11726_2XN타일링
2020.09.27 -
알고리즘104 :: BOJ_1766_문제집
알고리즘104 :: BOJ_1766_문제집
2020.09.26 -
알고리즘104 :: 최소 스패닝 트리(MST)
알고리즘104 :: 최소 스패닝 트리(MST)
2020.09.24