技巧:利用优先队列找出第K小团,然后用 bitset 来存图,可以利用其自带函数直接判断是否可以新增点。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 105;
int n, k;
ll w[maxn], c;
bitset<maxn> mp[maxn], temp;
struct node {
ll c;
bitset<maxn> s;
bool friend operator<(node a, node b) {
return a.c > b.c;
}
} now;
int main() {
string x;
scanf("%d", &n);
for (int i = 1; i <= n; i++) cin >> w[i];
for (int i = 1; i <= n; i++) {
cin >> x;
for (int j = 0; j < n; j++)
if (x[j] == '1') mp[i].set(j + 1);
}
temp.reset();
priority_queue<node> q;
q.push(node{0, temp});
while (!q.empty()) {
now = q.top();
temp = now.s, c = now.c;
q.pop();
if (--k == 0) {
cout << c << endl;
return 0;
}
int pos = 1;
for (int i = 1; i <= n; i++) if (temp[i]) pos = i + 1;
for (int i = pos; i <= n; i++) {
if ((mp[i] & temp) == mp[i]) {
temp.set(i);
q.push(node{c + w[i], temp});
temp.reset(i);
}
}
}
cout << -1 << endl;
return 0;
}