uva 658 - It's not a Bug, it's a Feature!(优先队列Dijkstra)

2024-06-05 04:38

本文主要是介绍uva 658 - It's not a Bug, it's a Feature!(优先队列Dijkstra),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:uva 658 - It's not a Bug, it's a Feature!



题目大意:有一个软件,有n个bug, 然后现在有m个补丁,然后m行,分别给出补丁需要的时间,以及原始状态和修复后的状态。对于原始状态,‘-’代表不能有这个bug,‘+’代表必须有这个bug,‘0’表示可有可无;对于修复后的状态,‘-’代表可以修复这个bug,‘+”代表会新增这个bug,’0‘是不变。问说修复n个bug的最短时间。


解题思路:可以转化成最短路问题,对于每个状态可以转换成二进制(bug存不存在),然后就可以用一个数来表示,然后就可以生成一个图,建图的过程就是暴力枚举所有可能,然后再与它修复后的状态建一条边,权值为时间。求最短路用Dijkstra算法,用优先队列优化,不然会超时。


#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>#define pii pair<int,int>
using namespace std;const int N = 1500000;
const int M = 30;
const int INF = 0x3f3f3f3f;struct state {int u;int d;
};struct cmp {bool operator () (const pii& a, const pii& b) {return a.first < b.first;}
};int n, m, tmp;
char s[M], b[M];
int cur, t[M], d, vis[N];
vector<state> v[N];void add(int x, int y) {state cur;cur.u = y, cur.d = d;v[x].push_back(cur);
}void dfs(int c, int *t) {if (c >= n) {int far = 0, son = 0, k;for (int i = 0; i < n; i++) {if (b[i] == '-')		k = 0;else if (b[i] == '+')	k = 1;else					k = t[i];far = far * 2 + t[i];son = son * 2 + k;}add(far, son);return;}if (s[c] == '0') {for (t[c] = 0; t[c] < 2; t[c]++)dfs(c + 1, t);} else {if (s[c] == '+')t[c] = 1;elset[c] = 0;dfs(c + 1, t);}
}void init() {int t[N];tmp = 1 << n;for (int i = 0; i < tmp; i++)	v[i].clear();for (int i = 0; i < m; i++) {scanf("%d%s%s", &d, s, b);memset(t, 0, sizeof(t));dfs(0, t);}	
}void solve() {int a[N], Min, c;priority_queue< pii, vector<pii>, greater<pii> > que;memset(a, INF, sizeof(a));memset(vis, 0, sizeof(vis));a[tmp - 1] = 0;que.push(make_pair(a[tmp - 1], tmp - 1) );while ( !que.empty() ) {pii cur = que.top(); que.pop();int x = cur.second;if (vis[x]) continue;vis[x] = 1;int f = v[x].size();for (int j = 0; j < f; j++) {int y = v[x][j].u;if ( a[y] > a[x] + v[x][j].d ) {a[y] = a[x] + v[x][j].d;que.push( make_pair(a[y], y) );}}}if (a[0] == INF)printf("Bugs cannot be fixed.\n\n");elseprintf("Fastest sequence takes %d seconds.\n\n", a[0]);
}int main () {int cas = 1;while (scanf("%d%d", &n, &m), n + m) {init();printf("Product %d\n", cas++);solve();}return 0;
}


这篇关于uva 658 - It's not a Bug, it's a Feature!(优先队列Dijkstra)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1032092

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

uva 10055 uva 10071 uva 10300(水题两三道)

情歌两三首,水题两三道。 好久没敲代码了为暑假大作战热热身。 uva 10055 Hashmat the Brave Warrior 求俩数相减。 两个debug的地方,一个是longlong,一个是输入顺序。 代码: #include<stdio.h>int main(){long long a, b;//debugwhile(scanf("%lld%lld", &