hdu1224 dp
#include<stdio.h> #include<string.h> #define maxn 105 int a[maxn],dp[maxn],map[maxn][maxn],pre[maxn]; int max(int x,int y) { return x>y?x:y; } void print(int p) { if(p==1)//一定从1点出发 { printf("1"); return ; } print(pre[p]); printf("->%d",p); } int main() { int i,j,t,n,m,ff=0; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } a[n+1]=0; scanf("%d",&m); memset(dp,0,sizeof(dp)); memset(map,0,sizeof(map)); for(i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); map[x][y]=1; } for(i=1;i<=n+1;i++) { for(j=1;j<=n+1;j++) { if(map[i][j]&&dp[j]<dp[i]+a[j])//到j点的值要大 { dp[j]=dp[i]+a[j]; pre[j]=i; } } } printf("CASE %d#\n",++ff); printf("points : %d\n",dp[n+1]); printf("circuit : "); print(pre[n+1]); printf("->1\n"); if(t!=0) printf("\n"); } }