문제
https://www.acmicpc.net/problem/1005
1005번: ACM Craft
첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부
www.acmicpc.net
코드
import sys
from collections import deque
input=sys.stdin.readline
t=int(input())
for _ in range(t):
n,k=map(int, input().split())
graph=[[] for _ in range(n+1)]
time=[0]+list(map(int, input().split()))
indegree=[0]*(n+1)
for _ in range(k):
a,b=map(int, input().split())
graph[a].append(b)
indegree[b]+=1
w=int(input())
dp=[0]*(n+1)
queue=deque()
for i in range(1,n+1):
if indegree[i]==0:
queue.append(i)
dp[i]=time[i]
while queue:
cur=queue.popleft()
for i in graph[cur]:
indegree[i]-=1
dp[i] =max(dp[i], dp[cur]+time[i])
if indegree[i]==0:
queue.append(i)
if indegree[w]==0:
print(dp[w])
break
import java.util.*;
import java.io.*;
public class Main
{
static int n;
static int k;
static int[] cost;
public static void main(String[] args) throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int tc=Integer.parseInt(br.readLine());
for (int t=0; t<tc; t++){
st = new StringTokenizer(br.readLine());
n=Integer.parseInt(st.nextToken());
k=Integer.parseInt(st.nextToken());
cost = new int[n+1];
st = new StringTokenizer(br.readLine());
for(int i=1; i<n+1; i++){
cost[i]=Integer.parseInt(st.nextToken());
}
List<List<Integer>> graph=new ArrayList<>();
for(int i=0; i<n+1; i++){
graph.add(new ArrayList<Integer>());
}
int[] indegree = new int[n+1];
for (int i=0; i<k; i++){
st=new StringTokenizer(br.readLine());
int v1=Integer.parseInt(st.nextToken());
int v2=Integer.parseInt(st.nextToken());
graph.get(v1).add(v2);
indegree[v2]++;
}
int des = Integer.parseInt(br.readLine());
topo(indegree,graph,des);
}
}
static void topo(int[] indegree, List<List<Integer>> graph, int des){
Queue<Integer> q=new LinkedList<Integer>();
int[] dp=new int[n+1];
for (int i=1; i<=n; i++){
dp[i]=cost[i];
if (indegree[i]==0){
q.add(i);
}
}
while(!q.isEmpty()){
int node = q.remove();
for(Integer i: graph.get(node)){
indegree[i]--;
dp[i]=Math.max(dp[i],dp[node]+cost[i]);
if (indegree[i]==0){
q.add(i);
}
}
}
System.out.println(dp[des]);
}
}
'문제풀이 > 그래프' 카테고리의 다른 글
[파이썬] [그래프] 백준 16202 MST 게임 (0) | 2023.04.03 |
---|---|
[파이썬] [그래프] 백준 1167 트리의 지름 (0) | 2022.04.03 |
[파이썬] [그래프] 백준 4195 친구 네트워크 (0) | 2022.03.29 |
[파이썬] [그래프] Pro 방의 개수 (0) | 2022.02.20 |
[파이썬] [그래프] Pro 순위 (0) | 2022.02.20 |