暴力bfs,搞个优先队列每次取出当前的最小值的团,bitset维护当前团有哪些点,
那么要新增一个点的时候,要保证新增点与在当前团中所有点都有两边,直接bitset & 一下判断
复杂度大概是 k*O(bitset<100>)*log(堆大小)。
由于bitset是常数级别的所以klog(堆大小)
在新增点的时候要保证新增的点的序号在当前团的最后一个点之后,这样才能保证不重复
#include<bits/stdc++.h>
#define maxl 110
using namespace std;
int n,k;
long long ans;
long long a[maxl];
int mp[maxl][maxl];
bitset <maxl> b[maxl];
char ch[maxl];
struct node
{
long long w;
int id;
bitset <maxl> s;
bool operator > (const node &y)const
{
return w>y.w;
}
};
priority_queue<node,vector<node>,greater<node> >q;
inline void prework()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
for(int i=0;i<n;i++)
{
scanf("%s",ch);
for(int j=0;j<n;j++)
{
mp[i][j]=ch[j]-'0';
b[i][j]=mp[i][j];
}
}
}
inline void mainwork()
{
node d;bitset <maxl> ds;
q.push(node{0,0,ds});
while(k>0 && !q.empty())
{
d=q.top();q.pop();
k--;
if(!k)
{
ans=d.w;
return;
}
for(int i=d.id;i<n;i++)
if(!d.s[i] && (d.s&b[i])==d.s)
{
d.s[i]=1;
q.push(node{a[i]+d.w,i,d.s});
d.s[i]=0;
}
}
ans=-1;
}
inline void print()
{
printf("%lld",ans);
}
int main()
{
prework();
mainwork();
print();
return 0;
}