http://acm.hdu.edu.cn/showproblem.php?pid=1224
#include<stdio.h> #include<string.h> int map[110][110],dp[110],pre[110],inst[110]; void output( int x ) { if(x==-1) return; output(pre[x]); printf("%d->",x); } int main(void) { int T,n,m,i,j,k,cases=1; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(map,-1,sizeof(map)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) scanf("%d",&inst[i]); inst[n+1]=0; scanf("%d",&m); for(k=1;k<=m;k++) { scanf("%d%d",&i,&j); map[i][j]=inst[j]; } pre[1]=-1; for(i=1;i<=n+1;i++) for(j=1;j<i;j++) { if(map[j][i]!=-1&& dp[j]+map[j][i]>dp[i]) { dp[i]=dp[j]+map[j][i]; pre[i]=j; } } if(cases>1) printf("\n"); printf("CASE %d#\n",cases++); printf("points : %d\n",dp[n+1]); printf("circuit : "); output(pre[n+1]); printf("1\n"); } return 0; }