您的位置:首页 > 其它

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

2017-06-04 14:26 351 查看

传送门

 

n <= 20 很小

所以可以状态压缩

然后因为可能存在环,所以不能DP

那么就用spfa找最短路

 

被位运算坑了,不清楚优先级一定要加括号

 

——代码

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#define M 301
#define N 4000001

int n, m;
int b1[M], b2[M], f1[M], f2[M], a[M], dis
;
bool vis
;

inline void spfa()
{
int i, v, u;
std::queue <int> q;
memset(dis, 0x33, sizeof(dis));
q.push((1 << n) - 1);
dis[(1 << n) - 1] = 0;
while(!q.empty())
{
u = q.front(), q.pop();
vis[u] = 0;
for(i = 1; i <= m; i++)
if((u | b1[i]) == u && !(u & b2[i]))
{
v = u ^ (u & f1[i]) | f2[i];
if(dis[v] > dis[u] + a[i])
{
dis[v] = dis[u] + a[i];
if(!vis[v])
{
q.push(v);
vis[v] = 1;
}
}
}
}
}

int main()
{
int i, j;
char s1[M], s2[M];
scanf("%d %d", &n, &m);
for(i = 1; i <= m; i++)
{
scanf("%d %s %s", &a[i], s1, s2);
for(j = 0; j < n; j++)
{
if(s1[j] == '+') b1[i] |= 1 << j;
if(s1[j] == '-') b2[i] |= 1 << j;
if(s2[j] == '-') f1[i] |= 1 << j;
if(s2[j] == '+') f2[i] |= 1 << j;
}
}
spfa();
dis[0] == dis[1 << n] ? puts("0") : printf("%d\n", dis[0]);
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: