2026-02-14 00:15:42 +09:00

61 lines
1.1 KiB
C

#include <stdio.h>
int N;
int build_graph[501][501];
int build_time[501];
int indegree[501];
int qu[501];
int front = -1, rear = 0;
int res[501];
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
scanf("%d",&N);
for(int i=1; i<=N; i++) {
scanf("%d", &build_time[i]);
while(1) {
int n;
scanf("%d", &n);
if(n == -1) break;
build_graph[n][++build_graph[n][0]] = i;
indegree[i]++;
}
}
for(int i=1; i<=N; i++) {
if(indegree[i] == 0) {
qu[rear++] = i;
res[i] = build_time[i];
}
}
while(front < rear) {
int now = qu[++front];
for(int i=1; i<=build_graph[now][0]; i++) {
int next = build_graph[now][i];
indegree[next]--;
res[next] = max(res[next], res[now] + build_time[next]);
if(indegree[next] == 0) {
qu[rear++] = next;
}
}
}
for(int i=1; i<=N; i++) {
printf("%d\n", res[i]);
}
return 0;
}