2019牛客多校第二场 D Kth Minimum Clique

10 篇文章 0 订阅
4 篇文章 0 订阅

暴力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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值