链接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;
}