网络流24题 软件补丁问题
Posted aaddvvaanntteezz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络流24题 软件补丁问题相关的知识,希望对你有一定的参考价值。
题解
- 这题好像不是网络流?
- 注意到$n$最大只有20,所以可以考虑把$bug$的状态压缩成一个整数,对应位上为1代表存在这个$bug$,0表示不存在这个$bug$
- 然后就可以根据补丁建图跑最短路就行了
查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> p;
const int maxn = 3e6+5;
const int mod = 1e9+7;
ll qpow(ll a,ll b){ll res=1;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
struct graph
{
int head[maxn],nxt[maxn<<1],to[maxn<<1],w[maxn<<1],sz;
void init(){memset(head,-1,sizeof(head));}
graph(){init();}
void push(int a,int b,int c){nxt[sz]=head[a],to[sz]=b,w[sz]=c,head[a]=sz++;}
int& operator[](const int a){return to[a];}
}g;
char s[22],t[22];
struct edge
{
int need,noneed,creat,del,c;
}a[105];
int d[1100005];
bool vis[1100005];
int main()
{
#ifndef ONLINE_JUDGE
freopen("simple.in", "r", stdin);
freopen("simple.out", "w", stdout);
#endif
int n,m;
scanf("%d%d",&n,&m);
int mx = 1<<n;
for(int i = 1,c;i <= m;++i){
scanf("%d%s%s",&a[i].c,s,t);
for(int j = 0;j < n;++j){
if(s[j]==‘+‘)a[i].need|=1<<j;
else if(s[j]==‘-‘)a[i].noneed|=1<<j;
if(t[j]==‘+‘)a[i].creat|=1<<j;
else if(t[j]==‘-‘)a[i].del|=1<<j;
}
}
memset(d,0x3f,sizeof(d));
d[mx-1]=0;
priority_queue<p>q;
q.push(make_pair(0,mx-1));
while(!q.empty()){
p now = q.top();
q.pop();
int cost = -now.first;
int u = now.second;
if(cost>d[u])continue;
vis[u]=1;
for(int i = 1;i <= m;++i){
if(((a[i].need&u)==a[i].need)&&((a[i].noneed&u)==0)){
int tmp = u|a[i].del;
tmp^=a[i].del;
tmp|=a[i].creat;
if(!vis[tmp]){
if(d[tmp]>cost+a[i].c){
d[tmp]=cost+a[i].c;
q.push(make_pair(-d[tmp],tmp));
}
}
}
}
}
if(!vis[0]){
printf("0
");
}
else printf("%d
",d[0]);
return 0;
}
以上是关于网络流24题 软件补丁问题的主要内容,如果未能解决你的问题,请参考以下文章