76 lines
1.4 KiB
C
76 lines
1.4 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
int T, N, K, W;
|
|
int dp[1001];
|
|
int build_info[1001][1001];
|
|
int build_time[1001];
|
|
int indegree[1001];
|
|
int q[1001];
|
|
|
|
int max(int a, int b) {
|
|
return a > b ? a : b;
|
|
}
|
|
|
|
int solve();
|
|
|
|
int main() {
|
|
scanf("%d", &T);
|
|
|
|
int* ans = (int*)malloc(sizeof(int)*T);
|
|
|
|
for(int t=0; t<T; t++) {
|
|
scanf("%d %d",&N, &K);
|
|
|
|
for(int i=1; i<=N; i++) {
|
|
scanf("%d",&build_time[i]);
|
|
build_info[i][0] = 0;
|
|
indegree[i] = 0;
|
|
dp[i] = -1;
|
|
}
|
|
|
|
for(int i=0; i<K; i++) {
|
|
int u, v;
|
|
scanf("%d %d",&u, &v);
|
|
build_info[u][++build_info[u][0]] = v;
|
|
indegree[v]++;
|
|
}
|
|
|
|
scanf("%d", &W);
|
|
|
|
ans[t] = solve();
|
|
}
|
|
|
|
for(int t=0; t<T; t++) printf("%d\n", ans[t]);
|
|
free(ans);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int solve() {
|
|
int front = 0, rear = 0;
|
|
for(int i=1; i<=N; i++) {
|
|
if(indegree[i] == 0) {
|
|
q[rear++] = i;
|
|
dp[i] = build_time[i];
|
|
}
|
|
}
|
|
|
|
while(front != rear) {
|
|
int now = q[front++];
|
|
|
|
if(now == W) break;
|
|
|
|
for(int i=1; i<=build_info[now][0]; i++) {
|
|
int next = build_info[now][i];
|
|
|
|
dp[next] = max(dp[next], dp[now] + build_time[next]);
|
|
|
|
indegree[next]--;
|
|
if(indegree[next] == 0) q[rear++] = next;
|
|
}
|
|
}
|
|
|
|
return dp[W];
|
|
}
|