UVA 658 It‘s not a Bug,it‘s a Feature(单源最短路,Dijkstra)

cadence virtuoso 激励信号源 vpulse,vpwl,vsin,vsource信号源介绍 阅读详情

UVA 658 It’s not a Bug,it’s a Feature(单源最短路,Dijkstra)

有n(n<=20)个潜在bug和m(m<=100)个补丁,每个补丁用两个长度为n的字符串表示,分别代表该补丁的前置环境和安装补丁后的状态。

在第一个表示前置环境的字符串中,0代表该位对应的Bug可有可无,+表示必须有该Bug,-表示必须没有该Bug;在第二个表示安装补丁后的状态的字符串内,0代表该Bug不变,+表示增加了该位Bug,-表示修复了该位Bug。

之前在动态规划中有过用二进制表示集合的经验(状态压缩),对于有n(n<=20)个状态位,每个状态只有0和1两个状态,显然可以用一个二进制的整数来表示一个单独的状态。

这样来,补丁的前置环境可化为一个整数节点u,安装补丁之后的状态可化为一个整数节点v,那么一个补丁就可以形象的表示为多个E(u,v)的有向边。

问题转换成在一张有向有环无负权的图,求单源最短路径的问题。该问题典型的一个算法是Dijkstra。

如果在表示状态中用1表示该位Bug存在,0表示不存在,那么该源的标号为s=(1<<n)-1,答案为d[0]。

整张图的节点有2n个,然而许多的节点是根本无法到达的,如果直接建图的话会浪费时间和内存(因为包含了许多无用节点和无用边)。

可以采用的一个方法是,在Dijkstra,当从优先队列取出一个节点时,遍历补丁通过位运算的方法看有无可以延伸的边,如果有则延伸并将新节点加入队列。其余的步骤跟Dijkstra算法无差别。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int max_n=(1<<21);
const int INF=0x3f3f3f3f;
int n,m;
struct HeapNode{
	int d,u;
	HeapNode(int i,int j):d(i),u(j){}
	bool operator <(const HeapNode& p) const{
		return d>p.d;
	}
};
int d[max_n];
int bug[1005],no_bug[1005],w[1005];
int bug_1[1005],no_bug_1[1005]; 
bool check(int u,int i)
{
	return ((u&no_bug[i])==0)&&((u&bug[i])==bug[i]);
}
int e(int u,int i)
{
	return ((u|no_bug_1[i])^no_bug_1[i])|bug_1[i];
}
void Dijkstra(void)
{
	memset(d,0x3f,sizeof(d));
	int s=(1<<n)-1;
	d[s]=0;
	priority_queue<HeapNode> q;
	q.push(HeapNode(0,s));
	while(!q.empty())
	{
		HeapNode cur=q.top();q.pop();
		int u=cur.u;
		if(d[u]!=cur.d)continue;
		for(int i=0;i<m;i++)
		if(check(u,i))
		{
			int v=e(u,i);
			if(d[v]>d[u]+w[i]){
				d[v]=d[u]+w[i];
				q.push(HeapNode(d[v],v));
			}
		}
	}
}
int main(void)
{
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	int cnt=1;
	while(~scanf("%d%d",&n,&m)&&n)
	{
		for(int i=0;i<m;i++)
		{
			string a,b;
			int c;
			cin>>c>>a>>b;
			int x=0,y=0;
			w[i]=c;
			for(int j=0;j<a.length();j++)
			{
				x=(x<<1)+(a[j]=='+'?1:0);
				y=(y<<1)+(a[j]=='-'?1:0);
			}
			bug[i]=x;no_bug[i]=y;
			x=y=0;
			for(int j=0;j<b.length();j++)
			{
				x=(x<<1)+(b[j]=='+'?1:0);
				y=(y<<1)+(b[j]=='-'?1:0);
			}
			bug_1[i]=x;no_bug_1[i]=y;
		}
		Dijkstra();
		printf("Product %d\n",cnt++);
		if(d[0]!=INF)printf("Fastest sequence takes %d seconds.\n",d[0]);
		else printf("Bugs cannot be fixed.\n");
		cout<<endl;
	}
//	fclose(stdin);
//	fclose(stdout);
}
//3 3
//1 000 00-
//1 00- 0-+
//2 0-- -++
//4 1
//7 0-0+ ----
//0 0

上述程序通过bug[]和no_bug[]数组来维护每个补丁前置环境的状态,通过bug_1[]和no_bug_1[]来维护用了该补丁后的状态。

2026年AI视频生成大模型全景指南:国内外主流工具深度对比与选型建议 AI视频生成技术在2025年至2026年间取得了突破性进展,从"能用"进化到"好用",商业化应用加速落地。中美双轨竞争格局基本成型,国内模型在技术追赶和本土化体验方面展现出强劲竞争力。对于用户而言,选择合适的AI视频生成工具需要综合考虑技术性能、使用门槛、成本预算和具体需求。零基础新手推荐海艺AI、通义万相等低门槛工具;进阶创作者可根据需求选择可灵AI、即梦AI、海艺AI等;专业开发者和企业用户可考虑智谱清影的开源能力或可灵AI的商业化服务。 阅读详情

相关推荐

Qlib数据获取避坑指南:从CSV导入到自定义数据源的完整解决方案

本文详细解析了Qlib数据获取的完整解决方案,从CSV导入到自定义数据源,涵盖了股票数据处理的关键技巧和常见陷阱。特别针对Qlib平台的数据格式要求和复权处理提供了实用指南,帮助量化投资者高效整合Wind等第三方数据源,确保数据质量与模型性能。

weixin_29047919的博客 304

uva_658_It's not a Bug, it's a Feature!(最短路)

题意:补丁在修补bug时,有时候会引入新的bug。假定有n(n<=20)个潜在bug和m(m<=100)个补丁,每个补丁用两个长度为n的字符串表示,其中字符串的每个位置表示一个bug。第一个串表示打补丁前的状态(“-”表示该bug必须不存在,“+”表示必须存在,“0”表示无所谓),第二个串表示打补丁后的状态(“-”表示不存在,“+”表示存在,“0”表示不变)。每个补丁都有一个执行时间,你的任务是用最少的时间把一个所有bug都存在的软件通过打补丁的方式变得没有bug。一个补丁可以打多次。

一点也不二 1880

Qoder + ADB Supabase :5分钟GET超火AI手办生图APP

本文介绍如何利用Qoder、阿里云 ADB Supabase 和通义千问图像编辑模型,快速构建AI手办生图Flutter应用。无需传统后端,通过AI生成代码、BaaS服务与边缘函数调用,实现从原型到上线的敏捷开发,全流程轻量高效,助力Vibe Coding落地实践。

数据库技术 931

【UVA】658 - It's not a Bug, it's a Feature!(隐式图 + 位运算)

位运算处理很重要

花月阁 874

tcl脚本语言之file的常见用法

这些命令覆盖了从文件属性获取、修改、复制、删除、路径处理等广泛的文件操作需求。命令用于处理文件系统操作。

hzmscut的博客 5149

从数据到特征:基于CAT12的MRI图像预处理实战指南

本文详细介绍了使用CAT12工具进行MRI图像预处理的完整实战流程。从数据获取、环境搭建到核心的AC-PC校正、组织分割、空间标准化与调制,逐步解析如何将原始脑影像数据转化为可用于机器学习的标准化特征图。重点阐述了预处理作为脑影像分析‘生命线’的重要性,并提供了避坑指南与自动化脚本建议,帮助研究者构建高质量的阿尔茨海默症分类模型输入特征。

weixin_29065959的博客 309

"Not a bug" VS "Won't Fix"

经常听到开发和QA如下的对话:   Case 1:   QA:“在我机器上工作不正常”;   Dev: 换个干净的机器试试;   QA: 干净的机器是好的。   Dev: 那是你机器的问题,不是Bug.   QA: .... Case 2:   Dev: 你为什么要报这个bug呢,我的代码都是对的啊,我的程序都是没问题的啊!;   QA: 可是程序不应该有这个结果啊";

dfgj 2968

【读书笔记】Verilog的亚稳态现象和跨时钟域处理方法

文章目录 一、亚稳态 (1)跨时钟域的亚稳态现象 (2)亚稳态的多径传输 二、跨时钟域处理 2.1 单bit信号跨时钟域处理 (1)单径两级触发器同步器 (2)相位控制 (3)多径与多级寄存器同步链 (4)组合逻辑信号的同步化 (5)快时钟域信号的同步化 2.2 多bit信号的跨时钟域处理 (1)异步FIFO (2)双口RAM.........

毕淑敏曾说过:“我不相信命运,我只相信自己的手;我不相信手掌上的纹路,但我相信手指加上手掌的力量”。在这个快节奏的社会,只有自己能力不足才会被卷,踏踏实实沉下心来学一些技术,及时记录,方便以后复盘。 2万+

UVA658 这不是bug,而是特性 It‘s not a Bug, it‘s a Feature!

题意:补丁在修正BUG时,有时也会引入新的BUG,假定有n(n<=20)n(n<=20) 个潜在BUG,和m(m<=100)m(m<=100) 个补丁,每个补丁用两个长度为nn 的字符串表示,其中字符串的每个位置表示一个bug,第一个串表示打补丁之前的状态(“-”表示该BUG必须不存在,“+”表示该补丁必须存在,0表示无所谓),第二串表示打补丁之后的状态(”-“表示不存在,“+”表示存在,0表示不变)。每个补丁有一定的执行时间,你的任务是用最小的时间把所有BUG都存在的软件变得没有.

gyp0205的博客 250

计算机网络实验报告实验七可靠传输TCP协议分析

计算机网络实验报告实验七可靠传输TCP协议分析

m0_56638814的博客 966

Python基础语法与最佳实践【python基础篇】

本文全面介绍了Python基础语法与最佳实践,涵盖变量与数据类型、控制流、函数、模块与包等核心概念。通过实际代码示例展示了条件语句、循环结构、函数定义及模块导入的基本用法。在最佳实践部分,重点讲解了PEP 8代码风格规范、异常处理技巧、列表推导式、上下文管理器、文档字符串编写以及enumerate和zip的高效使用。这些内容既适合Python初学者掌握基础语法,也能帮助有经验的开发者编写更规范、高效、可维护的代码。文章强调遵循Python官方推荐实践,通过合理运用语言特性提升代码质量。

博客 1975

斐波那契数列以及Catalan数通项公式的推导

1、斐波那契数列的通项公式推导: 已知斐波那契数列的递推公式为f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2)且f(0)=0,f(1)=1f(0)=0,f(1)=1f(0)=0,f(1)=1。 设斐波那契数列的生成函数为F(x)F(x)F(x),F(x)=∑i=0nf(i)xiF(x)=\sum_{i=0}^nf(i)x^iF(x)=∑i=0n​f(i)xi。 ...

WedsonLin的博客 1947

环境仿真软件:MIKE 21_(9).MIKE21水生植物模块介绍

MIKE21支持多种水生植物的模拟,用户需要在配置文件中定义植物种类及其特性。</</</</</</</</</假设我们需要定义一种新的水生植物“水葫芦”(Water Hyacinth),并将其特性写入配置文件。# 创建XML根元素# 定义新的植物种类# 生成XML文件假设我们需要分析仿真的水流速度变化,并绘制水流速度随时间变化的图。# 读取NetCDF文件# 获取水流速度数据# 获取时间数据# 绘制水流速度随时间变化的图plt.xlabel('时间 (天)')

kkchenjj的博客 727

二次剩余与Cipolla算法

二次剩余与Cipolla算法 若存在x,使得 x2≡a(modp)x^2\equiv a \pmod{p}x2≡a(modp) 成立且a不是p的倍数,则称a为模p的二次剩余。 下文只讨论p为奇素数的情况。 1、模p二次剩余的个数 对于一个素数p,p的二次剩余有(p-1)/2个,非二次剩余有(p-1)/2个。 因为有(p−x)2≡x2(modp)(p-x)^2\equiv x^2 \pmod{p}(p−x)2≡x2(modp),所以在[1,(p-1)/2]范围内即可得到模p的所有二次剩余数,只需要证明在[1,

WedsonLin的博客 899

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Timus 1673(反欧拉函数)

Timus 1673(反欧拉函数) 题目链接 有题意可知,设第i个教授掌管的实验室编号为index,则满足index≡i(modN)index\equiv i\pmod Nindex≡i(modN);对于第k个同学,只去编号为index′=kx(k≥1)index'=kx(k\ge 1)index′=kx(k≥1)的实验室。如果第k个同学要获得考试资格,则满足如下同余方程组 {kx1≡1(modN)kx2≡2(modN)...kxN≡N(modN)\left\{\begin{matrix} kx_1\eq

WedsonLin的博客 663

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Miller-Rabin随机性素数测试方法

关于素数测试 素数测试就是判断一个整数是素数还是合数。一般判断素数p的方式是通过判断2到根号p内的整数是否可以整除p来实现。时间复杂度为O(p1/2)。如果p是一个m位二进制整数,m=floor(Ig(p+1)),O(p1/2)=O(2m/2)。 然而对于大整数而言,这样的时间复杂度显然是不可以接受的。 费马小定理:if n is prime   ∀a∈Zn∗ , an−1≡1(modn)if\space n\space is\

WedsonLin的博客 635

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Codeforces Round #707 Div. 2/C Going Home

Codeforces Round #707 Div. 2/C Going Home 题意:在长度为N的数组A中找出满足ax+ay=aw+aza_x+a_y=a_w+a_zax​+ay​=aw​+az​的一组x,y,w,zx,y,w,zx,y,w,z,要求它们之间两两不同。(N≤2e5,1≤a[i]≤2.5e6(N\le 2e5,1\le a[i]\le 2.5e6(N≤2e5,1≤a[i]≤2.5e6 。 最简单直接的算法就是枚举序列中的(i,j)(i,j)(i,j)然后加以判断,这样做的做法是O(n2)O

WedsonLin的博客 610

关于概率的一些事(对于贝叶斯公式的一些初级理解)

关于概率的一些事 条件概率公式: P(A|B)=P(AB)/P(B)- - -111 当A,B事件相互独立时,有P(AB)=P(A)*P(B) P(B|A)=P(AB)/P(A)- - -222 联立111,222式,可得 P(A|B)=P(A)*P(B|A)/P(B)- - -333 333式也叫贝叶斯公式。 其中P(A)也叫先验概率(Prior probability),即在不知道B事件发生前,对A事件的一个主观评估的概率; P(A|B)也叫后验概率(Posterior probability),即在发

WedsonLin的博客 461

UVA 12563 (劲歌金曲)(多条件最优的动态规划问题)(01背包

UVA 12563 (劲歌金曲)(多条件最优的动态规划问题)(01背包) 依照题意可知,首要条件是:在t-1的时间内唱最多的歌曲数目,次要条件是:在不超过t-1的时间内唱的最久。 可以用dp_1[i]去表示在 i 时间内能唱的最多曲数。 用dp_2[i]去表示在 i 时间内能唱的最久时间。 状态转移的决策思想为: 1、如果在 j 时间内唱当前歌曲比不唱当前歌曲有着更大的歌曲数,那么同时更新dp_1和dp_2的值。 2、如果在 j 时间内唱当前歌曲和不唱当前歌曲有着一样的歌曲数,那么如果唱当前歌曲有着更长的唱

WedsonLin的博客 415

UVA1347(Tour)(DAG上的动态规划)

UVA1347(Tour)(DAG上的动态规划) 本题的难点主要在于状态的定义,即如何去表示节点的状态。 在紫书中,作者选择了dp(i,j)来表示第一个人走到了i点,第二个人走到了j点,且编号小于max(i,j)的节点都被走过。因为dp[i][j]和dp[j][i]是重复的,因此规定i>j。这样可以保证无后效性,因为小于max(i,j)的点都被选过了,接下来就是在大于max(i,j)里面选点,所以之后的状态不会影响到前面的状态。 接下来考虑状态如何转移,由于状态的定义,下一步只能向编号大于i的节点移动

WedsonLin的博客 413

扩展中国剩余定理(EXCRT)

扩展中国剩余定理(EXCRT) 中国剩余定理可以解形如下面的一元线性同余方程组: {ans≡x1(moda1)ans≡x2(moda2)ans≡x3(moda3)...ans≡xn(modan) \left\{\begin{matrix} ans\equiv x_1\pmod{a_1} \\ ans\equiv x_2\pmod{a_2} \\ ans\equiv x_3\pmod{a_3}\\ .\\ .\\ .\\ ans\equiv x_n\pmod{a_n} \end{matrix}\right.

WedsonLin的博客 407

Codeforces Round #707 (Div. 2, based on Moscow Open Olympiad in Informatics)/D

Codeforces Round #707 (Div. 2, based on Moscow Open Olympiad in Informatics)/D D.Two chandeliers 题意:给出两个无限循环序列A,B以及整数k,找出最小长度x满足对于1≤i≤x1\le i\le x1≤i≤x,恰好有k对ai≠bia_i\ne b_iai​​=bi​。 A序列的循环节长度为n,B序列为m。 对于序列A,B,找出循环节中所有的ai≠bia_i\ne b_iai​​=bi​的时间复杂度是O(nm)O

WedsonLin的博客 393

关于组合数取模

关于组合数取模 对于C(n,m) mod p (m<=n) 1、如果n,m比较,1<=m<=n<=1000,p<=1e9 可以用杨辉三角递推式去解决,用C[n][m]来储存C(n,m)的值,则递推式为: C[i][j] mod p=(C[i-1][j-1]+C[i-1][j]) mod p(1<=j<=i) C[i][0]=1 2、如果n,m较大,p较小(1<=m<=n<=1e18,p<=1e5 and p is prime) 可以用Luca

WedsonLin的博客 358

Codeforces Round #705 (Div. 2)/D. GCD of an Array

Codeforces Round #705 (Div. 2) D. GCD of an Array 题意:给出一个长度为n的数组,每次对其中一个元素进行乘法操作,然后询问整个数组的GCD。 首先肯定想到的是,对数组的元素进行质因数分解,然后每次更新只用更新单个元素的质因数表达式。同时维护所有元素共有质因数的最小次幂,以便求GCD。 之后需要考虑的式用什么数据结构来维护每个元素的质因数表达式和所有元素共有质因数的最小次幂。 1、对于维护每个元素的质因数表达式。如果用vector则不便于修改,方法之一是可以使用

WedsonLin的博客 352

UVA1601 The Morning after Halloween

UVA1601 The Morning after Halloween 本题型属于搜索题,通过bfs去枚举状态,从而找到解。然而该题的状态数上限是256的三次方,状态转移有5的3次方个方法,转移代价高。解决方法: 1、因为题目保证每2×2个方格一定有一个障碍,所以可以将所有空格提取出来。目的是在状态转移时不用每次去判断条件(越界、有障碍)。 2、双向bfs,将起点和终点同时放进队列。 3、A*算法。 锦上添花之举: 1、用编码(encoding)的方法将每个状态(节点的位置)压缩成一个整数再放进队列;取出来

WedsonLin的博客 348

UVA 10817 Headmaster‘s Headache(最优配对问题,DP,状态压缩)

UVA 10817 Headmaster’s Headache(最优配对问题,DP,状态压缩) 题目大意:有m个在校老师,n个求职者,s个课程,给出每个人的工资和授课集合,在校老师必须聘请,每个课程匹配至少两名老师,求最少工资开销。 咋一看,我的思路是用d(i,S)表示考虑前i个课程和集合S中的教师和求职者完成配对的最少工资开销,然后发现不行,状态转移表示不出来,而且集合无法用二进制表示。 参考了紫书上的分析,我发现我还是太年轻了。紫书上用d(i,s1,s2),表示考虑了前i个人,集合s1表示当前状态有且仅

WedsonLin的博客 346
上一篇: UVA 1151 Buy or Build(最小生成树,Kruskal)
下一篇: UVA 11582 Colossal Fibonacci Numbers(数论)
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值