[网络流24题] 洛谷P2761 软件补丁问题
2024-10-07 18:14:08
题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序。对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中的所有错误,而不包含 B2(i)中的任何错误时,才可以使用补丁 i。补丁 i 将修复软件中的某些错误 F1(i),而同时加入另一些错误 F2(i)。另外,每个补丁都耗费一定的时间。 试设计一个算法,利用公司提供的 m 个补丁程序将原软件修复成一个没有错误的软件,并使修复后的软件耗时最少。
虽然是网络流24题,但是这题好像应该用最短路来做。
把20个bug状态压缩成二进制表示,然后跑Dijkstra最短路即可。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N=;
const int INF=0x3f3f3f3f;
int n,m;
struct bug{
int tim;
char p[],q[];
}a[N]; bool check(int now,int k) {
for (int i=;i<m;i++)
if (a[k].p[i]=='+' && !(now&(<<i)) || a[k].p[i]=='-' && (now&(<<i))) return ;
return ;
} int change(int now,int k) {
for (int i=;i<m;i++) {
if (a[k].q[i]=='-') now=now&(~(<<i));
if (a[k].q[i]=='+') now=now|(<<i);
}
return now;
} int d[<<];
priority_queue<pii> q;
int Dijkstra() {
memset(d,0x3f,sizeof(d));
d[(<<m)-]=;
q.push(make_pair(,(<<m)-));
while (!q.empty()) {
pii x=q.top(); q.pop();
if (d[x.second]!=-x.first) continue;
for (int i=;i<=n;i++)
if (check(x.second,i)) {
int y=change(x.second,i);
if (d[x.second]+a[i].tim<d[y]) {
d[y]=d[x.second]+a[i].tim;
q.push(make_pair(-d[y],y));
}
}
}
return d[]==INF ? : d[];
} int main()
{
scanf("%d%d",&m,&n);
for (int i=;i<=n;i++) scanf("%d%s%s",&a[i].tim,&a[i].p,&a[i].q); cout<<Dijkstra()<<endl;
return ;
}
最新文章
- 浅析java内存模型--JMM(Java Memory Model)
- 使用github的使用,利用git shell命令行模式进行操作
- mongoDB简介
- [python爬虫] Selenium定向爬取虎扑篮球海量精美图片
- flex datagrid 换行
- Sprite Kit 入门教程
- Android HandlerThread 使用
- SQL Server 版本号汇总
- JavaScript高级程序设计-13:事件
- MySQL关于check约束无效的解决办法
- Android图片setBackgroundResource和setImageResource的区别
- 景观指数分析 - 初识FragStats4.2
- 浅析java程序的执行过程
- MySQL多实例的环境下,服务器端本地连接到指定实例的问题(sock方式连接)
- c#: 创建桌面快捷方式
- Houdini OpenCL
- 为虚拟机配置NAT网络
- 安装和使用ZFS
- OnlineJudgeFE之前端二次开发
- SpringCloud 进阶之Zuul(路由网关)