UVa658 It's not a Bug, it's a Feature! (最短路,隐式图搜索)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa658 It's not a Bug, it's a Feature! (最短路,隐式图搜索)相关的知识,希望对你有一定的参考价值。

链接:http://vjudge.net/problem/UVA-658

分析:Dijkstra求隐式图最短路。

 

 1 #include <cstdio>
 2 #include <queue>
 3 using namespace std;
 4 
 5 const int maxn = 20;
 6 const int maxm = 100 + 5;
 7 const int INF = 1000000000;
 8 
 9 int n, m, t[maxm], vis[1 << maxn], dist[1 << maxn];
10 char before[maxm][maxn + 5], after[maxm][maxn + 5];
11 
12 struct Node {
13     int bugs, dist;
14     bool operator < (const Node& rhs) const {
15         return dist > rhs.dist;
16     }
17 };
18 
19 int solve() {
20     priority_queue<Node> q;
21     for (int i = 0; i < (1 << n); i++) { vis[i] = 0; dist[i] = INF; }
22     Node start;
23     start.dist = 0;
24     start.bugs = (1 << n) - 1;
25     dist[start.bugs] = 0;
26     q.push(start);
27     while (!q.empty()) {
28         Node u = q.top(); q.pop();
29         if (u.bugs == 0) return u.dist;
30         if (vis[u.bugs]) continue;
31         vis[u.bugs] = 1;
32         for (int i = 0; i < m; i++) {
33             bool patchable = true;
34             for (int j = 0; j < n; j++) {
35                 if (before[i][j] == - && (u.bugs >> j & 1)) {patchable = false; break; }
36                 if (before[i][j] == + && !(u.bugs >> j & 1)) { patchable = false; break; }
37             }
38             if (!patchable) continue;
39             Node u2;
40             u2.dist = u.dist + t[i];
41             u2.bugs = u.bugs;
42             for (int j = 0; j < n; j++) {
43                 if (after[i][j] == -) { u2.bugs &= ~(1 << j); }
44                 if (after[i][j] == +) { u2.bugs |= (1 << j); }
45             }
46             int& D = dist[u2.bugs];
47             if (u2.dist < D) {
48                 D = u2.dist;
49                 q.push(u2);
50             }
51         }
52     }
53     return -1;
54 }
55 
56 int main() {
57     int kase = 0;
58     while (scanf("%d%d", &n, &m) == 2 && n) {
59         for (int i = 0; i < m; i++) scanf("%d%s%s", &t[i], before[i], after[i]);
60         int ans = solve();
61         printf("Product %d\n", ++kase);
62         if (ans < 0) printf("Bugs cannot be fixed.\n\n");
63         else printf("Fastest sequence takes %d seconds.\n\n", ans);
64     }
65     return 0;
66 }

 

以上是关于UVa658 It's not a Bug, it's a Feature! (最短路,隐式图搜索)的主要内容,如果未能解决你的问题,请参考以下文章

UVa 658 - It's not a Bug, it's a Feature!(Dijkstra + 隐式图搜索)

uva 658It's not a Bug, it's a Feature!(图论--Dijkstra算法+二进制表示)

It&#39;s not a Bug, It&#39;s a Feature! (poj 1482 最短路SPFA+隐式图+位运算)

uva658(最短路径+隐式图+状态压缩)

uva658 dijkstra+状态压缩

状态转移的最短路 隐式图搜索 UVA 658