链接http://acm.hdu.edu.cn/showproblem.php?pid=4571
距离上的cost用floyd算
是否停留用dp求
最后遍历dp[i][j]搜索答案
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef struct { int c,s,num; }Point; int g[105][105]; Point a[105]; int pos[105]; int dp[105][305]; bool cmp(Point x,Point y) { return x.s<y.s; } int main() { int i,j,n,m,t,s,x,y,z,ans,e,k,T,kase=1; scanf("%d",&T); while(T--) { scanf("%d%d%d%d%d",&n,&m,&t,&s,&e); for(i=0;i<n;i++) scanf("%d",&a[i].c); for(i=0;i<n;i++) { scanf("%d",&a[i].s); a[i].num=i; } sort(a,a+n,cmp); for(i=0;i<n;i++) pos[a[i].num]=i; s=pos[s]; e=pos[e]; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j) g[i][j]=0; else g[i][j]=10000000; } } for(i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&z); x=pos[x]; y=pos[y]; g[x][y]=min(g[x][y],z); g[y][x]=min(g[y][x],z); } for(k=0;k<n;k++) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { g[i][j]=min(g[i][j],g[i][k]+g[k][j]); } } } printf("Case #%d:\n",kase++); memset(dp,-1,sizeof(dp)); for(i=0;i<n;i++) { for(j=a[i].c+g[i][s];j<=t;j++) dp[i][j]=a[i].s; } for(i=0;i<n;i++) { for(j=0;j<i;j++) { if(a[j].s==a[i].s) break; for(k=0;k<=t;k++) { if(k<a[i].c+g[i][j]||dp[j][k-a[i].c-g[i][j]]==-1) continue; dp[i][k]=max(dp[i][k],dp[j][k-a[i].c-g[i][j]]+a[i].s); } } } ans=0; for(i=0;i<n;i++) { for(j=0;j<=t;j++) { if(j+g[i][e]>t) break; ans=max(ans,dp[i][j]); } } printf("%d\n",ans); } return 0; }