luogu2761 软件补丁问题

Posted poorpool

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu2761 软件补丁问题相关的知识,希望对你有一定的参考价值。

状压最短路

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
struct Node{
    int bi1, bi2, fi1, fi2;
}nd[105];
int n, m, ww[105], cnt, dis[1050005];
bool vis[1050005];
char a[25], b[25];
queue<int> d;
void spfa(){
    memset(dis, 0x3f, sizeof(dis));
    int uu=(1<<n)-1;
    dis[uu] = 0;
    d.push(uu);
    vis[uu] = true;
    while(!d.empty()){
        int x=d.front();
        d.pop();
        vis[x] = false;
        for(int i=1; i<=m; i++)
            if((x&nd[i].bi1)==nd[i].bi1 && (x&nd[i].bi2)==0){
                int tmp=x;
                tmp &= ~(nd[i].fi1);
                tmp |= nd[i].fi2;
                if(dis[tmp]>dis[x]+ww[i]){
                    dis[tmp] = dis[x] + ww[i];
                    if(!vis[tmp]){
                        vis[tmp] = true;
                        d.push(tmp);
                    }
                }
            }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1; i<=m; i++){
        scanf("%d", &ww[i]);
        scanf("%s %s", a, b);
        for(int j=0; j<n; j++){
            if(a[j]==‘+‘)   nd[i].bi1 |= 1<<j;
            if(a[j]==‘-‘)   nd[i].bi2 |= 1<<j;
        }
        for(int j=0; j<n; j++){
            if(b[j]==‘-‘)   nd[i].fi1 |= 1<<j;
            if(b[j]==‘+‘)   nd[i].fi2 |= 1<<j;
        }
    }
    spfa();
    if(dis[0]==0x3f3f3f3f)  cout<<"0"<<endl;
    else    cout<<dis[0]<<endl;
    return 0;
}

以上是关于luogu2761 软件补丁问题的主要内容,如果未能解决你的问题,请参考以下文章

[luoguP2761] 软件补丁问题(状压最短路)

洛谷 P2761 软件补丁问题 spfa

P2761 软件补丁问题 状压最短路

C++ 错误 - C4819、C2761、C2447

续:纠正:ubuntu7.04可以安装,而且完美的安装 ! for《Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4不含4以上,及 ubuntu 7.04不含(代码片段

poj2761 Feed the dogs