记录编号 572319 评测结果 AAAAAAAA
题目名称 软件补丁 最终得分 100
用户昵称 GravatarHeSn 是否通过 通过
代码语言 C++ 运行时间 0.013 s
提交时间 2022-06-30 16:46:28 内存使用 19.31 MiB
显示代码纯文本
#include<bits/stdc++.h> 
using namespace std;
const int N=1<<22, M=105, INF=0x3f3f3f3f;
struct pack {
	int b1, b2, f1, f2, t;
}p[M];
int n, m, d[N];
bool v[N];
char ch, s[22];
bool SPFA() {
	memset(d, 0x3f, sizeof(d));
	queue<int> q;
	int x = (1 << n) - 1;
	d[x] = 0;
	q.push(x);
	while(!q.empty()) {
		int u = q.front();
		q.pop();
		v[u] = 0;
		for(int i = 1; i <= m; i ++) {
			if((u & p[i].b1) == p[i].b1 && (u & p[i].b2) == 0) {
				int nxt = ((u | p[i].f1) ^ p[i].f1) | p[i].f2;
				if(d[nxt] > d[u] + p[i].t) {
					d[nxt] = d[u] + p[i].t;
					if(v[nxt] == 0) {
						v[nxt] = 1;
						q.push(nxt);
					}
				}
			}
		}
	}
	return d[0] != INF;
}
int main() {
	freopen("bugs.in", "r", stdin);
	freopen("bugs.out", "w", stdout);
	cin >> n >> m;
	char s1[22], s2[22];
	for(int i = 1; i <= m; i ++) {
		cin >> p[i].t;
		scanf("%s%s", s1, s2);
		for(int j = 0; j < n; j ++) {
			if(s1[j] == '+') {
				p[i].b1 |= 1 << j;
			}
			else if(s1[j]=='-') {
				p[i].b2 |= 1 << j;
			}
		}
		for(int j = 0; j < n; j ++) {
			if(s2[j] == '+') {
				p[i].f2 |= 1 << j;
			}
			else if(s2[j]=='-') {
				p[i].f1 |= 1 << j;
			}
		}
	}
	if(SPFA()) {
		cout << d[0] << endl;
	}
	else {
		cout << -1 << endl;
	}
	return 0;	
}