博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[网络流24题]软件补丁问题
阅读量:4580 次
发布时间:2019-06-09

本文共 1094 字,大约阅读时间需要 3 分钟。

分析

裸的最短路:

把错误集合状压成一个二进制,第i为为1表示有第i个错误

把这个状态x作为图上的节点编号,dist[x]表示转移到状态x需要的时间

显然初始状态为dist[\(2^n-1\)]最终的答案为dist[0]

转移的时候枚举每一个补丁,通过位运算判断补丁i是否能修复当前状态

代码

#include
#include
#include
#include
#include
#define maxm 1005#define maxn 1<<21 #define INF 0x3f3f3f3fusing namespace std;int n,m;char s[maxm];int t[maxm];int b1[maxm],b2[maxm],f1[maxm],f2[maxm];int dist[maxn];int inq[maxn];int spfa(int s){ queue
q; memset(dist,0x3f,sizeof(dist)); q.push(s); dist[s]=0; inq[s]=1; while(!q.empty()){ int x=q.front(); q.pop(); inq[x]=0; for(int i=1;i<=m;i++){//枚举每一个补丁 if((b1[i]|x)==x&&(b2[i]&x)==0){//x包括b1[i],不包括b2[i] int y=x^(x&f1[i]);//x&f1[i]为x中能被修复的错误,再异或就相当于把错误去掉 y|=f2[i];//加上新增的错误 if(dist[y]>dist[x]+t[i]){ dist[y]=dist[x]+t[i]; if(!inq[y]){ q.push(y); inq[y]=1; } } } } } if(dist[0]==INF) return 0; else return dist[0];}int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d",&t[i]); scanf("%s",s); for(int j=0;j

转载于:https://www.cnblogs.com/birchtree/p/10602802.html

你可能感兴趣的文章
Android Studio 导入新工程项目
查看>>
Jupyter导出PDF从入门到绝望(已解决)
查看>>
vue的挖坑和爬坑之css背景图样式终极解决方法
查看>>
可变字典
查看>>
DS博客作业-05--树
查看>>
记录一些常用的JS属性和语句
查看>>
Map接口
查看>>
iOS启动图 LaunchImage LaunchScreen.xib
查看>>
[转]利用/*+Ordered*/提高查询性能
查看>>
JdbcTemplate 操作Oracle Blob
查看>>
循序渐进地进行代码重构
查看>>
centos7 yum安装配置redis 并设置密码
查看>>
鸟哥私房菜第六章 用户与用户组
查看>>
LRU Cache数据结构简介
查看>>
17.2.2.1 The Slave Relay Log Slave中继日志
查看>>
3.1.2 MVC模式和URL访问
查看>>
node.js
查看>>
gcc编译
查看>>
如何配置Java EE Eclipse+Tomcat 开发环境
查看>>
Android水平(横向)翻页列表,类似水平GridVIew
查看>>