直接DFS+减枝
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct Edge
{
int to;
int w;
int money;
int next;
}edge[10005];
int k,n,r,num;
int head[105];
bool visit[105];
int MINLEN = 0x7fffffff;
void DFS(int start,int len,int mon)
{
if(len>=MINLEN||mon>k)
return;
visit[start] = true;
if(start==n)
{
if(len<MINLEN&&mon<=k)
{
MINLEN = len;
}
return;
}
for(int i = head[start];i!=0;i=edge[i].next)
{
if(visit[edge[i].to]==false)
{
DFS(edge[i].to,len+edge[i].w,mon+edge[i].money);
visit[edge[i].to] = false;
}
}
}
int main()
{
int u,v,w,c;
while(scanf("%d",&k)!=EOF)
{
num = 0;
MINLEN = 0x7fffffff;
for(int i = 0;i<105;i++)
{
visit[i] = false;
head[i] = 0;
}
scanf("%d %d",&n,&r);
for(int i = 1;i<=r;i++)
{
scanf("%d %d %d %d",&u,&v,&w,&c);
edge[i].to = v;
edge[i].w = w;
edge[i].money= c;
edge[i].next = head[u];
head[u] = i;
}
DFS(1,0,0);
if(MINLEN == 0x7fffffff)
MINLEN = -1;
printf("%d\n",MINLEN);
}
return 0;
}