前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >19 nowcoder 多校 第二场 D Kth Minimum Clique 第k小团

19 nowcoder 多校 第二场 D Kth Minimum Clique 第k小团

作者头像
用户2965768
发布2019-08-01 10:27:59
4230
发布2019-08-01 10:27:59
举报
文章被收录于专栏:wym

题意:求第k小团

题解:用优先队列存状态, bitset存团中点的状态

每次选取最后一个标记点的下一个这样保证不重复

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
typedef bitset<105> bs;
typedef long long ll;
int n,k;
ll w[1000005];
bitset<105> f[105];
struct pi {
	ll ans;
	bs s;
	bool operator < (const pi &c)const {
		return ans>c.ans;
	}
};
priority_queue<pi> q;
int main() {
	scanf("%d %d",&n,&k);
	for(int i=1; i<=n; i++) {
		scanf("%d",&w[i]);
	}
	getchar();
	char tp;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			scanf("%c",&tp);
			if(tp=='1')f[i][j] = 1;
		}
		getchar();
	}
	bs t; t.reset();
	q.push((pi){0,t});
	while(!q.empty()) {
		pi tmp = q.top();
		q.pop();
		k--;
		bs r = tmp.s;
		int pos = 1; for(int i=1;i<=n;i++)if(r[i])pos = i+1;
		if(k==0) {
			printf("%lld\n",tmp.ans);
			return 0;
		}
		for(int i=pos; i<=n; i++) {
			if(!r[i]&&((r&f[i])==r)) {
				r[i] = 1;
				q.push((pi) {tmp.ans+w[i],r});
				r[i] = 0;
			}
		}
	}
	printf("-1\n");
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年07月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档