未调试
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 5010
#define MAXE 40010
#define INF 100000
typedef struct
{
int v;
int k;
int t;
}edges;
typedef struct
{
int degree[MAXN];
edges edge[MAXN][MAXE];
}graph;
int n,m;
int k;
int s,t;
int min;
graph g;
void dfs(int s,int kk,int dd)
{
int i,j;
int x,y;
int nv,nk,nt;
for(i=1;i<=g.degree[s];i++)
{
nv=g->edge[s][g.degree[s]].v;
nk=g->edge[s][g.degree[s]].k;
nt=g->edge[s][g.degree[s]].t;
if(nk+kk<k)
{
if(nv==t)
{
if(dd+nt<min)
min=dd+nt;
}
else
{
dfs(nv,nk+kk,nt+dd);
}
}
}
}
/*
使用DFS+剪枝
对于每一个点,遍历其所有的边
如果体力超过限度,则自动停止
如果达到底端,计算最小时间
*/
int main(void)
{
int i,j;
int x,y,c,d;
memset(g.degree,0,sizeof(g.degree));
min=INF;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d%d",&x,&y,&c,&d);
g.degree[x]++;
g.edge[x][g.degree[x]].v=y;
g.edge[x][g.degree[x]].k=c;
g.edge[x][g.degree[x]].t=d;
}
scanf("%d%d",&s,&t);
scanf("%d",&k);
dfs(s,0,0);
if(min==INF)
printf("-1\n");
else
printf("%d\n",min);
return 0;
}