关键词:状态压缩 最短路径

想不出快速办法,就先考虑考虑暴力。枚举每一种错误分布的情况,然后通过可用的补丁转化为另多种情况,这些情况又转化为更多种情况……我们可以用图来表示这种关系!

状态压缩:每个错误的状态可以压缩在一个整数里。

最短路径:如果一个状态可以用补丁变为另一种状态,则两个状态间连一条边,权值为补丁所需时间。

注意:二进制运算符,如&,|等,优先级比==低。所以有二进制运算时,等号左边记得要加括号。

#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 软件补丁问题 状态压缩最短路径的更多相关文章

  1. POJ 3311 Hie with the Pie(DP状态压缩+最短路径)

    题目链接:http://poj.org/problem?id=3311 题目大意:一个送披萨的,每次送外卖不超过10个地方,给你这些地方之间的时间,求送完外卖回到店里的总时间最小. Sample In ...

  2. luogu2761 软件补丁问题

    状压最短路 #include <iostream> #include <cstring> #include <cstdio> #include <queue& ...

  3. uva658(最短路径+隐式图+状态压缩)

    题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...

  4. Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)

    Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...

  5. leetcode 864. 获取所有钥匙的最短路径(BFS,状态压缩)

    题目链接 864. 获取所有钥匙的最短路径 题意 给定起点,要求在最短步骤内收集完所有钥匙,遇到每把锁之前只有 有对应的钥匙才能够打开 思路 BFS+状态压缩典型题目 先确定起点和总的钥匙数目,其次难 ...

  6. COGS439. [网络流24题] 软件补丁

    [问题描述] 对于一个软件公司来说,在发行一个新软件之后,可以说已经完成了工作.但是实际上,许多软件公司在发行一个新产品之后,还经常发送补丁程序,修改原产品中的错误(当然,有些补丁是要收费的). 如某 ...

  7. P2761 软件补丁问题

    P2761 软件补丁问题 思路 貌似不用网络流,直接状态压缩 用spfa跑最短路,直接判断是否能过 位运算太渣了,WA了好几发 代码 #include <bits/stdc++.h> us ...

  8. [网络流24题] 洛谷P2761 软件补丁问题

    题意:某公司发现其研制的一个软件中有 n个错误,随即为该软件发放了一批共 m 个补丁程序.对于每一个补丁 i ,都有 2 个与之相应的错误集合 B1(i)和 B2(i),使得仅当软件包含 B1(i)中 ...

  9. uva658 dijkstra+状态压缩

    题目大意: 假定有n个潜在的bug和m个补丁,每个补丁用长为n的字符串表示.首先输入bug数目以及补丁数目.然后就是对m 个补丁的描述,共有m行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两 ...

随机推荐

  1. Spring Boot (21) 使用Swagger2构建restful API

    使用swagger可以与spring mvc程序配合组织出强大的restful api文档.它既可以减少我们创建文档的工作量,同时说明内容又整合入现实代码中,让维护文档和修改代码整合为一体,可以让我们 ...

  2. 【转载】JavaScript中同名标识符优先级-Snandy

    一,局部变量先使用后声明,不影响外部同名变量 var x = 1; // --> 外部变量x function fn(){ alert(x); // --> undefined 局部变量x ...

  3. 解决emlog默认导航不能修改的问题以及修改后台登录地址的方法

    修改默认导航 我们需要使用修改代码的方式来解决 首先找到admin/navbar.php文件 然后找到需要删除的几行代码: if ($type != Navi_Model::navitype_cust ...

  4. Android Fragment与Activity交互的几种方式

    这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...

  5. OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主

    首先准备好所有要使用到的文件 下载链接:https://share.weiyun.com/5WgQHtx 步骤1. 首先安装驱动 解压后执行 Install.bat 部分电脑需要禁用驱动程序签名才可以 ...

  6. 关于VirtualBox与锐捷冲突导致锐捷不断掉线的问题的解决办法

    和VM一样,virtualBox也是和锐捷冲突,网上有一些方法是禁用虚拟网卡,但是还是会导致锐捷客户端掉线,除非使用wifi 第一个解决办法: 偶然看到一个解决办法是,在锐捷客户端登陆之后,打开任务管 ...

  7. jQueryAjax模拟按键消抖(可设置抖动延迟时间)

    在硬件中,按键等都会有抖动现象,如何消除抖动,不重复触发事件呢,这就要用到消抖机制了. 这是我用jQuery模拟硬件消抖原理,额,可能是吧...又不对的地方,希望有高手指点指点. <!DOCTY ...

  8. ANN:ML方法与概率图模型

    一.ML方法分类:          产生式模型和判别式模型 假定输入x,类别标签y         -  产生式模型(生成模型)估计联合概率P(x,y),因可以根据联合概率来生成样本:HMMs   ...

  9. 我的web前端自学之路-心得篇:我为什么要学习web前端?

    时光如流水,转眼间,自己已经是大三的学长了,看着一个个学弟学妹,心中有种莫名的感觉,很怀念大学的前两年时光,但也很憧憬着自己的未来,自己将要去经历很多从未经历的事.我是我们学校信科院的一名学生,在编程 ...

  10. spring IOC 装配一个bean

    1.0属性注入 新建一个people类 package com.java.test3; /** * @author nidegui * @create 2019-06-22 14:45 */ publ ...