一个背包的问题 先floyd跑个最短路
再背包一下(这里的背包不是连续的)
#include <sstream>
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#define maxn 110
#define inf 2139062143
using namespace std;
int g[110][110];
int dp[maxn][310];
struct node
{
int sa,cost,id;
bool operator<(const node& rhs) const
{
return sa<rhs.sa;
}
} spot[maxn];
int S,E;
int T;
int N,M;
void floyd()
{
int i,j,k;
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
if(i==j) g[i][j]=0;
else g[i][j]=100000000;
}
}
for(i=0; i<M; i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
g[a][b]=g[b][a]=min(g[a][b],c);
}
for(k=0; k<N; k++)
{
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
g[spot[i].id][spot[j].id]=min(g[spot[i].id][spot[j].id],g[spot[i].id][spot[k].id]+g[spot[k].id][spot[j].id]);
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
int i,j,k;
int CASE;
scanf("%d",&CASE);
int test=0;
while(CASE--)
{
scanf("%d %d %d %d %d",&N,&M,&T,&S,&E);
for(i=0; i<N; i++)
{
scanf("%d",&spot[i].cost);
spot[i].id=i;
}
for(i=0; i<N; i++)
{
scanf("%d",&spot[i].sa);
}
sort(spot,spot+N);
floyd();
printf("Case #%d:\n",++test);
if(g[S][E]>T)
{
puts("0");
continue;
}
memset(dp,-1,sizeof(dp));
int ans=0;
for(i=0; i<N; i++)
{
if(g[S][spot[i].id]+spot[i].cost<=T)
{
dp[spot[i].id][g[S][spot[i].id]+spot[i].cost]=spot[i].sa;
}
if(T-(g[S][spot[i].id]+spot[i].cost)>=g[spot[i].id][E])
{
ans=max(ans,dp[spot[i].id][g[S][spot[i].id]+spot[i].cost]);
}
}
for(i=1; i<N; i++)
{
for(j=T; j>=0; j--)
{
for(k=0; k<i; k++)
{
if((j>=(g[spot[k].id][spot[i].id]+spot[i].cost))&&(spot[i].sa>spot[k].sa)&&
dp[spot[k].id][j-g[spot[k].id][spot[i].id]-spot[i].cost]!=-1)
{
dp[spot[i].id][j]=max(dp[spot[i].id][j],dp[spot[k].id][j-g[spot[k].id][spot[i].id]-spot[i].cost]+spot[i].sa);
}
}
if(T-j>=g[spot[i].id][E])
{
ans=max(ans,dp[spot[i].id][j]);
}
}
}
printf("%d\n",ans);
}
return 0;
}