题意:
从初始房间到达终止房间需要经过一系列的房间,没经过一个房间会得到一个价值,从一个房间到达另一个房间同时需要消耗一定的时间,在规定的时间内从初始到达终止房间 所能达到的最大值是多少
#include<stdio.h>
#include<string.h>
#define INF 99999999
const int MAXN=15;
int mp[MAXN][MAXN];//储存路径以及时间
int vis_room[MAXN];//标记房间是否走过
int vis_edge[MAXN][MAXN];//标记这条路是否走过
int jewel[MAXN];//每个房间的价值
int ans1;//储存最大的价值
int n,m,t;//房间数量,路径数量,规定的时间
int s,e;//初始房间,终止房间
//主要思想房间走过无所谓,路径走过不要再走了
void DFS(int s,int value,int time)
{
int flag;
if(value==INF) return;//房间不可达到
if(s==e && value>ans1) ans1=value;//到达了终点并且价值大,替换
for (int i=0;i<n;i++)
{
flag=0;
if(mp[s][i]!=INF && vis_edge[s][i]==0 && time+mp[s][i]<=t)//房间可以到达,并且路径没有走过
{
if(vis_room[i]==0)
{
flag=1;
value+=jewel[i];//走过的房间财富不用加
vis_room[i]=1;
}
vis_edge[s][i]=1;
DFS(i,value,time+mp[s][i]);//房间走过了财富不用加,时间继续加
//if(i!=初始房间)//这句话有没有无所谓,只是多搜了几步而已,不过也要注意
if(flag)//若该房间以前走过了,价值就不需要减
{
value-=jewel[i];
vis_room[i]=0;
}
vis_edge[s][i]=0;
}
}
}
int main()
{
int a,b,c;
int i,j;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
ans1=ans2=0;
memset(vis_room,0,sizeof(vis_room));
memset(vis_edge,0,sizeof(vis_edge));
scanf("%d%d",&s,&e);
for (i=0;i<n;i++)
for (j=0;j<n;j++)
mp[i][j]=INF;
for (i=0;i<n;i++)
scanf("%d",&jewel[i]);
for (i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
mp[a][b]=c;
mp[b][a]=c;
}
vis_room[s]=1;
//这里是wrong的原因,初始房间不一定是0;
DFS(s,jewel[s],0);//位置,初始房间财宝价值,所用时间
printf("%d\n",ans1);
}
return 0;
}