//1005 #include<iostream> #include<vector> usingnamespacestd; #define MAXSIZE 1001 int D[MAXSIZE]={0};//건물 건설 시간 vector<int> required[MAXSIZE]; //요구되는 건물 리스트 int time[MAXSIZE]={0};//동적 계획법을 이용하여 반복되는 계산을 방지 int T,N,K;//테스트케이스 T, 건물 수 N, 건물 순서 규칙 수 K
intbuild(int w){ if(time[w]!=-1) return time[w]; //미리 계산된 건설시간이 있다면 시간을 절약할 수 있음 if(required[w].empty()) return time[w] = D[w]; //요구 건물이 없을 경우 건설 intmax=0, calculated=0; for(int i=0;i<required[w].size();i++){ //건물 w를 건설하기 위해 필요한 건물 리스트업 calculated = build(required[w][i]); //임의의 요구 건물을 건설하는데 걸리는 시간 계산 if(calculated>max) max = calculated; //동시 건설시 결정되는 시간 } return time[w] = max + D[w]; //요구 건물의 동시건설시간 + 건물 W의 건설시간 = 전체 건설시간 }
intmain(){ int X,Y; scanf("%d",&T); while(T--){ scanf("%d %d",&N,&K); for(int i=1;i<=N;i++){//각 테스트케이스마다 초기화 필요 required[i].clear(); time[i]=-1; scanf("%d",&D[i]);//건물 건설 시간 D } while(K--){ //건물 건설 순서 규칙 scanf("%d %d",&X,&Y); required[Y].push_back(X); } //목표 건물 W int W; scanf("%d",&W); printf("%d\n",build(W)); } return0; }