61 lines
1.1 KiB
C
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;
|
|
} |