小明游天界
首先是
n
、
m
、
t
n、m、t
n、m、t,分别带表有
n
n
n个景点,有
m
m
m个单位时间,
t
t
t个路线
接下来
t
t
t行,每行三个数,
x
、
y
、
z
x、y、z
x、y、z,代表
x
x
x到
y
y
y和
y
y
y到
x
x
x需要
z
z
z个单位时间
求从
1
1
1到
n
n
n刚好用了
m
m
m个时间单位,且经过的景点数最多(可以重复经过某个景点)
样例输入
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]代表用
i
i
i个单位时间到达
j
j
j点最多经过的景点数。
#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);
}