TYVJ 1248 丛林探险 解题报告
就用DFS吧,然后注意剪枝和环就行,代码如下:
#include <stdio.h> #include <stdlib.h> int rode[80000], next[80000]; int time[80000], tili[80000]; int tail; int head[5000]; int n, m; int have, ans = 0xFFFFFFF; int use, tmp; int t; void add(int a, int b, int c, int d) { tili[tail] = c; time[tail] = d; rode[tail] = b; next[tail] = head[a]; head[a] = tail; tail++; } int used[5000]; void srch(int s) { int i; if(s == t){ ans = tmp; return; } for(i = head[s]; i != -1; i = next[i]){ tmp += time[i]; use += tili[i]; if(use <= have && tmp < ans && !used[rode[i]]){ used[rode[i]] = 1; srch(rode[i]); used[rode[i]] = 0; } tmp -= time[i]; use -= tili[i]; } } int main(int argc, char **argv) { int i; int a, b, c, d; int s; scanf("%d%d", &n, &m); for(i = 0; i < n; i++){ head[i] = -1; } for(i = 0; i < m; i++){ scanf("%d%d%d%d", &a, &b, &c, &d); a--, b--; add(a, b, c, d); add(b, a, c, d); } scanf("%d%d%d", &s, &t, &have); s--, t--; used[s] = 1; srch(s); if(ans == 0xFFFFFFF){ printf("-1\n"); }else{ printf("%d\n", ans); } return 0; }