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
| #include <bits/stdc++.h> using namespace std; const int maxn = 16, maxm = (1 << 16), inf = 0x3f3f3f3f; int n, m, a[maxn], s[maxm], d[maxm], fa[maxn], dp[maxm];
struct node { int x_, y_, z_; bool operator<(const node &x) const { return z_ < x.z_; } } e[maxm];
int find(int x) { if (fa[x] == x) return x; return fa[x] = find(fa[x]); }
int kruskal(int state) { for (int i = 0; i < n; ++i) { if ((1 << i) & state) fa[i] = i; } int ans = 0; for (int x, y, i = 1; i <= m; ++i) { if (((1 << e[i].x_) & state) && ((1 << e[i].y_) & state)) { x = find(e[i].x_), y = find(e[i].y_); if (x != y) { ans += e[i].z_; fa[x] = y; } } } int ancestor = -1; for (int i = 0; i < n; ++i) { if ((1 << i) & state) { if (ancestor == -1) { ancestor = find(i); } else if (ancestor != find(i)) { return inf; } } } return ans; }
int main() { cin >> n >> m; for (int i = 0; i < n; ++i) cin >> a[i]; for (int x, y, z, i = 1; i <= m; ++i) { cin >> x >> y >> z; e[i].x_ = x, e[i].y_ = y, e[i].z_ = z; } for (int i = 0; i < (1 << n); ++i) { for (int j = 0; j < n; ++j) { if ((1 << j) & i) s[i] += a[j]; } } memset(d, 0x3f, sizeof(d)); sort(e + 1, e + 1 + m); for (int i = 0; i < (1 << n); ++i) { if (s[i]) continue; d[i] = kruskal(i); } memcpy(dp, d, sizeof(d)); dp[0] = 0; for (int i = 1; i < (1 << n); ++i) { if (s[i]) continue; for (int k, j = i; j; j = (j - 1) & i) { k = i ^ j; if ((j & k) || s[j] || s[k]) continue; dp[i] = min(dp[i], dp[j] + dp[k]); } } if (dp[(1 << n) - 1] == inf) puts("Impossible"); else cout << dp[(1 << n) - 1] << endl; return 0; }
|