小明游天界
首先是n、m、tn、m、tn、m、t,分别带表有nnn个景点,有mmm个单位时间,ttt个路线
接下来ttt行,每行三个数,x、y、zx、y、zx、y、z,代表xxx到yyy和yyy到xxx需要zzz个单位时间
求从111到nnn刚好用了mmm个时间单位,且经过的景点数最多(可以重复经过某个景点)
样例输入
5 12 4
1 2 5
1 4 3
4 2 4
2 5 5
样例输出
4
思路
DP
f[i][j]f[i][j]f[i][j]代表用iii个单位时间到达jjj点最多经过的景点数。
#include<iostream>
#include<cstdio>
using namespace std;
int f[1010][1010],a[50005][3];
int l,k,n,m;
int main()
{
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;++i)
scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][3]);
f[0][1]=1;f[m][n]=-1;
for (int i=1;i<=m;++i)
for(int j=1;j<=k;++j)
{
if(i-a[j][3]<0)continue;
if(f[i-a[j][3]][a[j][2]]>0)
f[i][a[j][1]]=max(f[i][a[j][1]],f[i-a[j][3]][a[j][2]]+1);
if(f[i-a[j][3]][a[j][1]]>0)
f[i][a[j][2]]=max(f[i][a[j][2]],f[i-a[j][3]][a[j][1]]+1);
}
printf("%d",f[m][n]);
fclose(stdin);
fclose(stdout);
}