http://poj.org/problem?id=1062
网上都说是dij,可是我想不到怎么dij。。。- -所以就只好暴力dfs+剪枝来做这题了。实践过,也就47ms,不会太长时间。这题注意的是,最高等级和最低等级的差不超过给定的值的判断。暴力搜索加上剪枝,剪枝的方法只需(1)跟目前找到的最小价格比较,判断是否继续找下去(2)判断是否曾经搜索了。
通过代码:
View Code
1 #include <cstdio>
2 #include <cmath>
3 #include <cstring>
4 #include <iomanip>
5 #include <iostream>
6 #include <algorithm>
7 #include <vector>
8 #include <string>
9 #include <queue>
10 #include <ctime>
11
12 using namespace std;
13
14 #define PB push_back
15 #define FI first
16 #define SE second
17 #define MPR make_pair
18 #define REP(i, n) for (int i = 0; i < n; i++)
19 #define REP_1(i, n) for (int i = 1; i <= n; i++)
20 #define FORI(i, a, b) for (int i = a; i < b; i++)
21 #define FORD(i, a, b) for (int i = a; i > b; i--)
22 #define _clr(x) memset(x, 0, sizeof(x))
23 #define _rst(x) memset(x, -1, sizeof(x))
24
25 typedef long long LL;
26 typedef pair<int, int> PII;
27 typedef vector<LL> VLL;
28 typedef vector<PII> VPII;
29 typedef vector<int> VI;
30 typedef vector<double> VDBL;
31 const int N = 105;
32 const int hashMod = 1e6 + 5;
33 const int inf = 0x55555555;
34 const double eps = 1e-8;
35 const LL linf = 0x5555555555555555ll;
36 const double finf = 1e50;
37 const double pi = acos(-1.0);
38
39 LL minCost;
40 int level;
41 bool vis[N];
42 struct Good {
43 int price, level;
44 VPII sub;
45 Good(int _p = 0, int _l = 0) {
46 price = _p, level = _l;
47 sub.clear();
48 }
49 } good[N];
50
51 void input(int n) {
52 int p, l, m;
53 REP_1(i, n) {
54 cin >> p >> l >> m;
55 good[i] = Good(p, l);
56 REP(j, m) {
57 cin >> p >> l;
58 good[i].sub.PB(MPR(p, l));
59 }
60 }
61 minCost = finf;
62 _clr(vis);
63 }
64
65 void dfs(LL curCost, int cur, int mn, int mx) {
66 int sz = good[cur].sub.size();
67 vis[cur] = true;
68 minCost = min(curCost + good[cur].price, minCost);
69 REP(i, sz) {
70 int id = good[cur].sub[i].FI, cost = good[cur].sub[i].SE;
71 if (!vis[id] && max(mx, good[id].level) - min(mn, good[id].level) <= level) {
72 if (curCost + cost <= minCost) {
73 dfs(curCost + cost, id, min(mn, good[id].level), max(mx, good[id].level));
74 }
75 }
76 }
77 vis[cur] = false;
78 }
79
80 int main() {
81 int n;
82 while (cin >> level >> n) {
83 input(n);
84 dfs(0, 1, good[1].level, good[1].level);
85 cout << minCost << endl;
86 }
87 return 0;
88 }
——written by Lyon
View Code