1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#include <bits/stdc++.h> using namespace std; #define int long long #define resetIO(x) \ freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout) #define debug(fmt, ...) \ fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) template <class _Tp> inline _Tp& read(_Tp &x) { bool sign = false; char ch = getchar(); long double tmp = 1; for (; !isdigit(ch); ch = getchar()) sign |= (ch == '-'); for (x = 0; isdigit(ch); ch = getchar()) x = x * 10 + (ch ^ 48); if (ch == '.') for (ch = getchar(); isdigit(ch); ch = getchar()) tmp /= 10.0, x += tmp * (ch ^ 48); return sign ? (x = -x) : x; } template <class _Tp> inline void write(_Tp x) { if (x < 0) putchar('-'), x = -x; if (x > 9) write(x / 10); putchar((x % 10) ^ 48); } const int MAXN = 200; const int MAXM = 1 << 20; const int INF = 0x3f3f3f3f3f3f3f3f; struct node { int u, dis; bool operator<(const node &o) const { return dis > o.dis; } }; struct bugfix { int c, b1, b2, f1, f2; }; int n, m, dis[MAXM]; bugfix g[MAXN]; char buf[MAXN]; priority_queue<node> que; signed main() { read(n), read(m); for (int i = 1; i <= m; ++i) { read(g[i].c); scanf("%s", buf); for (int j = 0; j < n; ++j) { if (buf[j] == '+') g[i].b1 |= (1 << j); if (buf[j] == '-') g[i].b2 |= (1 << j); } scanf("%s", buf); for (int j = 0; j < n; ++j) { if (buf[j] == '-') g[i].f1 |= (1 << j); if (buf[j] == '+') g[i].f2 |= (1 << j); } } memset(dis, 0x3f, sizeof(dis)); dis[(1 << n) - 1] = 0; que.push({(1 << n) - 1, 0ll}); while (!que.empty()) { node t = que.top(); que.pop(); if (dis[t.u] < t.dis) continue; int u = t.u, d = t.dis; for (int i = 1; i <= m; ++i) { bugfix& b = g[i]; if ((u & b.b1) == b.b1 && (u & b.b2) == 0) { int v = (u & (~b.f1)) | b.f2; if (dis[v] > dis[u] + b.c) { dis[v] = dis[u] + b.c; que.push({v, dis[v]}); } } } } if (dis[0] == INF) puts("0"); else write(dis[0]), putchar('\n'); return 0; }
|