1. 程式人生 > >洛谷 P2761 軟件補丁問題 【spfa】

洛谷 P2761 軟件補丁問題 【spfa】

include 枚舉 不用 push const ostream spa ios 出現

…為什麽最短路的題會出現在網絡流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】