题意:给出一张有向图。图中的每条路径有长度和花费,经过这条路需要花费对应的花费。现在一个人想从城市1到城市N,但他只带了K元钱。求在合理花费下的最短路。
思路:因为点很少,就可以直接DFS。只需加入一个最优性优化。
坑:因为数组开小了,竟然TLE了。。。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX = 110;
const int INF = 0x3f3f3f3f;
int K,N,R;
struct edge{
int to,len,mo;
edge(){}
edge(int t, int l, int m):to(t),len(l),mo(m){}
} edges[10010];
int head[MAX];
int nxt[10010];
int tot;
int ans;
bool used[MAX];
void init()
{
tot = 0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v, int l, int m)
{
edges[tot] = edge(v,l,m);
nxt[tot] = head[u];
head[u] = tot++;
}
void dfs(int u, int money, int len)
{
if(len > ans) return;
if(u == N && len < ans){
ans = len;
return;
}
for(int i = head[u]; ~i; i = nxt[i]){
edge & e = edges[i];
if(!used[e.to] && money >= e.mo){
used[e.to] = true;
dfs(e.to,money - e.mo,len + e.len);
used[e.to] = false;
}
}
}
int main(void)
{
//freopen("in","r",stdin);
while(~scanf("%d%d%d",&K,&N,&R)){
int s,d,l,t;
init();
for(int i = 0; i < R; ++i){
scanf("%d%d%d%d",&s,&d,&l,&t);
addedge(s,d,l,t);
}
memset(used,0,sizeof(used));
ans = INF;
used[1] = true;
dfs(1,K,0);
if(ans == INF)
ans = -1;
printf("%d\n",ans);
}
return 0;
}