import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer ;
import java.io.IOException ;
public class Main{
private static int[] point ;
private static int[][] map ;
private static int[] pre ;
private static int[] dp ;
private static void output(int x){
if(x==-1)return ;
output(pre[x]) ;
System.out.printf("%d->",x) ;
}
public static void main(String arg[])throws IOException{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))) ;
in.nextToken() ;
int casenum = 0 ;
int T = (int)in.nval ;
while(T-->0){
in.nextToken() ;
int n = (int)in.nval ;
point = new int[n+2] ;
for(int i=1;i<=n;i++){
in.nextToken() ;
point[i] = (int)in.nval ;
}
in.nextToken() ;
int m = (int)in.nval ;
map = new int[n+2][n+2] ;
while(m-->0){
in.nextToken() ;
int a = (int)in.nval ;
in.nextToken() ;
int b = (int)in.nval ;
map[a][b] = 1 ;
}
pre = new int[n+2] ;
//递归出口
pre[1] = -1 ;
dp = new int[n+2] ;
//最长公共子序列变形
for(int i=1;i<=n+1;i++){
for(int j=1;j<i;j++){
if(map[j][i]==1&&dp[j]+point[i]>dp[i]){
dp[i] = dp[j] + point[i] ;
//记录路径
pre[i] = j ;
}
}
}
//两个案例之间有空行,在后面写会PE
if(casenum>0){
System.out.println() ;
}
System.out.println("CASE "+(++casenum)+"#") ;
System.out.println("points : "+dp[n+1]) ;
System.out.print("circuit : ") ;
//递归寻找前驱并输出路径
output(pre[n+1]) ;
System.out.println(1) ;
}
}
}
hdu1224 Free DIY Tour最长上升子序列变形+图论(java)
最新推荐文章于 2024-10-11 12:01:25 发布