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! (最短路,隐式图搜索)

时间: 2024-10-26 23:22:27

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

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

链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=599 题意: 补丁在修正bug时,有时也会引入新的bug.假定有n(n≤20)个潜在bug和m(m≤100)个补丁,每个补丁用两个长度为n的字符串表示,其中字符串的每个位置表示一个bug.第一个串表示打补丁之前的状态("-"表示该bug必须不存在,"+&

uva658 It&#39;s not a Bug, it&#39;s a Feature!

传送门https://vjudge.net/problem/UVA-658 看到这题以为是搜索.不过直接搜索估计会G. 正解是隐式图搜索,(看上去挺像bfs的,实际上就是带着权值的bfs,于是就变成了最短路 隐式图搜索就是在一个没有直接给出边的图上进行图论算法(最短路什么的 现在只碰到了最短路 虽然说没有直接给出边,但是可以通过题目给的条件建边,比如这题就是在状态u的时候,枚举所有补丁,看是否可以使用,使用后状态变为v,那么u->v就可以建边 为什么要隐式图搜索呢?正常每个状态枚举补丁也可以呀.

[题解]UVA658 It&#39;s not a Bug, it&#39;s a Feature!

链接:http://vjudge.net/problem/viewProblem.action?id=22169 描述:有n个漏洞,m个修复漏洞的方法,每种方法耗时不一样,求修复漏洞的最短时间.每种方法的使用对当前漏洞分布的状态有要求,符合要求才能修复,并有可能引入新漏洞. 思路:单源点最短路 这道题卡了我很久,因为不知道怎么表示状态.最开始受到'0'的影响,觉得必须要三进制,于是写得很麻烦还错了.之后觉得可以用二进制分别存储'+'和'-'的状态.我定义两个数组,Condition[i][0]表

uva_658_It&#39;s not a Bug, it&#39;s a Feature!(最短路)

It's not a Bug, it's a Feature! Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu SubmitStatus Description It is a curious fact that consumers buying a new software product generally donot expect the software to be bug-free. C

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

题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100) 个补丁,每个补丁用两个长度为 n 的字符串表示,其中字符串的每个位置表示一个 bug.第一 个串表示打补丁之前的状态("-" 表示该 bug 必须不存在,"+" 表示必须存在,0 表示无所 谓),第二个串表示打补丁之后的状态("-" 表示不存在,

UVA 658 It&#39;s not a Bug, it&#39;s a Feature! (单源最短路,dijkstra+优先队列,变形,经典)

题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了:要打多久才能无bug?(同1补丁可重复打) 分析: n<=20,那么用位来表示bug的话有220=100万多一点.不用建图了,图实在太大了,用位图又不好玩.那么直接用隐式图搜索(在任意点,只要满足转移条件,任何状态都能转). 但是有没有可能每个状态都要搜1次啊?那可能是100万*100万啊,这样出题

hdu1818 It&#39;s not a Bug, It&#39;s a Feature!(隐式图最短路径Dijkstra)

题目链接:点击打开链接 题目描述:补丁在修bug时,有时也会引入新的bug,假设有n(n<=20)个潜在的bug和m(m<=100)个补丁,每个补丁用两个长度为n的字符串表示,其中字符串的每个位置表示一个bug.第一个串表示打补丁之前的状态('-'表示在该位置不存在bug,'+'表示该位置必须存在bug,0表示无所谓),第二个串表示打补丁之后的状态('-'表示不存在,'+'表示存在,0表示不变).每个补丁都有一个执行时间,你的任务是用最少的时间把一个所有bug都存在的软件通过打补丁的方式变得没

658 - It&#39;s not a Bug, it&#39;s a Feature! (Dijkstra算法)

今天第一次系统的学习了一下最短路算法,开始刷第十一章,第一次写Dijkstra算法,出现了很多喜闻乐见的错误..而且uva上样例很水,瓢虫也很水 ,坑了我好久. 首先是对于结点的处理,我们必须要维护一个二元组,一个表示结点一个表示当前结点最短路.   因为Dijkstra算法利用了优先队列来加速算法,所以需要定义小于运算符,一开始我直接将状态装进了优先队列,显然是不对的,因为优先队列的作用就是取出当前距离最短的结点. 其次,说说最短路算法蕴含的巧妙思想: 每次从当前所有还未标记的结点中选择一个距

【HDOJ】1818 It&#39;s not a Bug, It&#39;s a Feature!

状态压缩+优先级bfs. 1 /* 1818 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAXM 105 11 12 typedef struct {