main.cc 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. using namespace std;
  5. const int K = 10000, R = 10000;
  6. const int N = 100, L = 100, T = 100;
  7. const int INF = 1 << 30;
  8. int k, n, r, min_l;
  9. // Save intermediate results for pruning,
  10. // mid_l[i][j] means the min len at city i with coin j.
  11. int mid_l[N + 1][K + 1];
  12. bool flag[N + 1];
  13. struct Path {
  14. int dst;
  15. int len;
  16. int cst;
  17. Path(int d, int l, int c) : dst(d), len(l), cst(c) {}
  18. };
  19. vector<Path> adj[N + 1];
  20. void dfs(int i, int p, int coin) {
  21. if (i == n) {
  22. min_l = min(min_l, p);
  23. return;
  24. }
  25. if (min_l <= p) return;
  26. if (mid_l[i][coin] <= p)
  27. return;
  28. else
  29. mid_l[i][coin] = p;
  30. flag[i] = true;
  31. vector<Path> &vec = adj[i];
  32. for (int j = 0; j < vec.size(); j++) {
  33. if (flag[vec[j].dst] || coin < vec[j].cst) continue;
  34. dfs(vec[j].dst, p + vec[j].len, coin - vec[j].cst);
  35. }
  36. flag[i] = false;
  37. };
  38. int main() {
  39. scanf("%d %d %d", &k, &n, &r);
  40. for (int i = 0, s, d, l, t; i < r; i++) {
  41. scanf("%d %d %d %d", &s, &d, &l, &t);
  42. adj[s].push_back(Path(d, l, t));
  43. }
  44. min_l = INF;
  45. memset(flag, 0, sizeof(flag));
  46. memset(mid_l, 0x3F, sizeof(mid_l));
  47. dfs(1, 0, k);
  48. if (min_l == INF)
  49. printf("-1\n");
  50. else
  51. printf("%d\n", min_l);
  52. return 0;
  53. }