zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    数据结构与算法4—队列
    栈的应用——括号匹配
    迷宫求解
    python的socket编程
    数据结构与算法3—栈
    数据结构与算法2—链表
    数据结构与算法1—线性表
    增量解析
    ElementTree类
    节点序列化
  • 原文地址:https://www.cnblogs.com/poorpool/p/8116588.html
Copyright © 2011-2022 走看看