洛谷 P2761 软件补丁问题 spfa

Posted lokiii

tags:

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

…为什么最短路的题会出现在网络流24里??
因为范围是15所以直接把每个状态作为一个点,向它能转移到的点连有向边即可。可以不用建图(据说建图存不下?),直接枚举m个转移方案。位运算比较麻烦注意不要写错。

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=1500005,inf=1e9;
int n,m,dis[N];
char c1[N],c2[N];
struct qwe
{
    int y,n,d,a,c;
}e[N];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%s%s",&e[i].c,c1,c2);
        for(int j=0;j<n;j++)
        {
            if(c1[j]==‘+‘)
                e[i].y^=(1<<(n-j-1));
            if(c1[j]==‘-‘)
                e[i].n^=(1<<(n-j-1));
            if(c2[j]==‘+‘)
                e[i].a^=(1<<(n-j-1));
            if(c2[j]==‘-‘)
                e[i].d^=(1<<(n-j-1));
        }
    }
    int s=(1<<n)-1,t=0;
    queue<int>q;
    for(int i=t;i<=s;i++)
        dis[i]=inf;
    dis[s]=0;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=1;i<=m;i++)
            if((u&e[i].n)==0&&(u&e[i].y)==e[i].y)
            {
                int now=((u|e[i].d)^e[i].d)|e[i].a;
                if(dis[now]>dis[u]+e[i].c)
                {
                    dis[now]=dis[u]+e[i].c;
                    q.push(now);
                }
            }
    }
    printf("%d\n",dis[t]==inf?0:dis[t]);
    return 0;
}

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

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

软件补丁问题(SPFA+位运算)

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

洛谷.4015.运输问题(SPFA费用流)

洛谷 P1462 通往奥格瑞玛的道路(spfa+二分搜索)(4boy)

[网络流24题] 软件补丁问题