没有文字,放图
题解
显而易见的dp
f[i][j]
表示时刻
i
走到
对于一张从
i
通往
不走,则
f[i+1][j]=min(f[i][j],f[i+1][j])
答案就是
f[t+1][n−1]
Code
#include <stdio.h>
#define inf 0x7fffffff
using namespace std;
struct ticket
{
int st,ed,lTime,aTime,cost;
}v[51];
int f[10001][51];
int min(int x,int y)
{
return x<y?x:y;
}
int main()
{
int n,t,m;
scanf("%d%d%d",&n,&t,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d%d%d",&v[i].st,&v[i].ed,&v[i].lTime,&v[i].aTime,&v[i].cost);
v[i].aTime+=v[i].lTime+1;
}
for (int i=0;i<=t+1;i++)
for (int j=0;j<n;j++)
f[i][j]=inf;
f[0][0]=0;
for (int i=0;i<=t;i++)
for (int j=0;j<n;j++)
{
if (f[i][j]!=inf)
for (int k=1;k<=m;k++)
if (v[k].st==j&&v[k].lTime==i&&v[k].aTime<=t+1)
f[v[k].aTime][v[k].ed]=min(v[k].cost+f[i][j],f[v[k].aTime][v[k].ed]);
f[i+1][j]=min(f[i][j],f[i+1][j]);
}
if (f[t+1][n-1]==inf)
f[t+1][n-1]=-1;
printf("%d\n",f[t+1][n-1]);
return 0;
}