luogu2761 软件补丁问题 状态压缩最短路径
关键词:状态压缩 最短路径
想不出快速办法,就先考虑考虑暴力。枚举每一种错误分布的情况,然后通过可用的补丁转化为另多种情况,这些情况又转化为更多种情况……我们可以用图来表示这种关系!
状态压缩:每个错误的状态可以压缩在一个整数里。
最短路径:如果一个状态可以用补丁变为另一种状态,则两个状态间连一条边,权值为补丁所需时间。
注意:二进制运算符,如&,|等,优先级比==低。所以有二进制运算时,等号左边记得要加括号。
#include <cstdio>
#include <cstring>
#include <cassert>
#include <iostream>
#include <queue>
#include <vector>
using namespace std; #define LOOP(i, n) for(int i=0; i<n; i++)
const int MAX_STATE = << , INF = 0x3f3f3f3f, MAX_BUG = , MAX_PATCH = ;
int TotBug, TotPatch;
int HaveBug[MAX_PATCH], Normal[MAX_PATCH], Repair[MAX_PATCH], Add[MAX_PATCH];
int W[MAX_PATCH]; struct Node;
struct Edge; struct Node
{
Edge *Head;
int Dist, State;
bool Inq;
Node() :Dist(INF){}
}_nodes[MAX_STATE];struct Edge
{
Node *To;
Edge *Next;
int Weight;
Edge(Node *to, Edge *next, int weight)
:To(to),Next(next),Weight(weight){}
};
vector<Edge*> _edges; void AddEdge(int uId, int vId, int weight)
{
Node *from = uId + _nodes, *to = vId + _nodes;
from->State = uId;
to->State = vId;
Edge *e = new Edge(to,from->Head,weight);
_edges.push_back(e);
from->Head = e;
} void Build(Node *cur)
{
LOOP(patch, TotPatch)
{
if (((cur->State & HaveBug[patch]) == HaveBug[patch]) && ((~cur->State) & Normal[patch]) == Normal[patch])
{
int newState = ((~Repair[patch])&cur->State) | Add[patch];
if (cur->State != newState)
AddEdge(cur->State, ((~Repair[patch])&cur->State) | Add[patch], W[patch]);
}
}
} void SPFA()
{
static queue<Node*> q;
int curState = ( << TotBug) - ;
Node *cur = curState + _nodes;
cur->State = curState;
cur->Dist = ;
Build(cur);
cur->Inq = true;
q.push(cur);
while (!q.empty())
{
cur = q.front();
q.pop();
if (cur->Inq)
cur->Inq = false;
for (Edge *e = cur->Head; e; e = e->Next)
{
if (cur->Dist + e->Weight < e->To->Dist)
{
if (e->To->Dist == INF)
Build(e->To);
e->To->Dist = cur->Dist + e->Weight;
if (!e->To->Inq)
{
e->To->Inq = true;
q.push(e->To);
}
}
}
}
} int main()
{
scanf("%d%d", &TotBug, &TotPatch);
char b[], f[];
LOOP(patch, TotPatch)
{
scanf("%d %s %s", &W[patch], b, f);
LOOP(bug, TotBug)
{
if (b[bug] == '+')
HaveBug[patch] |= ( << bug);
else if (b[bug] == '-')
Normal[patch] |= ( << bug);
if (f[bug] == '+')
Add[patch] |= ( << bug);
else if (f[bug] == '-')
Repair[patch] |= ( << bug);
}
}
SPFA();
printf("%d\n", _nodes[].Dist == INF ? : _nodes[].Dist);
return ;
}
luogu2761 软件补丁问题 状态压缩最短路径的更多相关文章
- POJ 3311 Hie with the Pie(DP状态压缩+最短路径)
题目链接:http://poj.org/problem?id=3311 题目大意:一个送披萨的,每次送外卖不超过10个地方,给你这些地方之间的时间,求送完外卖回到店里的总时间最小. Sample In ...
- luogu2761 软件补丁问题
状压最短路 #include <iostream> #include <cstring> #include <cstdio> #include <queue& ...
- uva658(最短路径+隐式图+状态压缩)
题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...
- Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)
Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...
- leetcode 864. 获取所有钥匙的最短路径(BFS,状态压缩)
题目链接 864. 获取所有钥匙的最短路径 题意 给定起点,要求在最短步骤内收集完所有钥匙,遇到每把锁之前只有 有对应的钥匙才能够打开 思路 BFS+状态压缩典型题目 先确定起点和总的钥匙数目,其次难 ...
- COGS439. [网络流24题] 软件补丁
[问题描述] 对于一个软件公司来说,在发行一个新软件之后,可以说已经完成了工作.但是实际上,许多软件公司在发行一个新产品之后,还经常发送补丁程序,修改原产品中的错误(当然,有些补丁是要收费的). 如某 ...
- P2761 软件补丁问题
P2761 软件补丁问题 思路 貌似不用网络流,直接状态压缩 用spfa跑最短路,直接判断是否能过 位运算太渣了,WA了好几发 代码 #include <bits/stdc++.h> us ...
- [网络流24题] 洛谷P2761 软件补丁问题
题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序.对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中 ...
- uva658 dijkstra+状态压缩
题目大意: 假定有n个潜在的bug和m个补丁,每个补丁用长为n的字符串表示.首先输入bug数目以及补丁数目.然后就是对m 个补丁的描述,共有m行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两 ...
随机推荐
- 如何正确从windows系统(自己电脑)远程访问Linux系统(他人电脑)的mysql数据库(图文详解)
这里,需要Linux系统开了root用户,我这给root用户密码为root. 同时,在mysql -uroot -proot执行进去之后 update user setHost='%' whe ...
- RabbitMQ 官方NET教程(六)【RPC】
在第二个教程中,我们学习了如何使用Work Queues在多个工作者之间分配耗时的任务. 但是如果我们需要在远程计算机上运行功能并等待结果怎么办? 那是一个不同的模式. 此模式通常称为远程过程调用或R ...
- Spring Boot (18) @Async异步
通常我们在某网站发送邮件验证码时,首先会提示验证码已发送,然而此时可能没有收到验证码,过几秒种才真正的收到.如果是同步会先验证发送是否成功然后再通知,如果是异步可以先通知用户已发送,并释放请求,然后再 ...
- css的外边距合并或者外边距塌陷问题
第一种情况: 已知两个宽和高均为100px,margin均为20px的div垂直排列,现象如下图所示: 当设置css1的margin-bottom:40px:或者css2的margin-top:40p ...
- SEO之如何做301转向
1.如果网站使用的是(Linux+Apache+MySQL+PHP)主机,可以使用.htaccess文件做301转向 比如把/index.html 301转向到http://www.xinlvtian ...
- angular2之组件通讯
定义父组件,在父组件中以路由插座形式引入子组件,定义相关输入输出属性 可以在同一模块内部定义多个组件,将一个组件引入另一个组件中去:也可以该模块整体导出,将该模块导入到其他模块,这样此模块中的组件就能 ...
- spring - quartz - experssion 表达式
字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN- ...
- MYSQL 45道练习题
学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示.用S ...
- GET 请求控制器 返回绑定后HTML
//$.get("/Home/index/" + $("#S_BookName").val(), function (data) { //MVC控制器返回Vie ...
- Jenkins 定时 构建项目
选择要定时构建的 项目-->配置-->构建触发器 触发项目: Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作. ...