题意

给一个n个结点的带点权的图,找到第k小的团的权值

分析

用bitset表示团的状态,一个结点必须和团里的每个结点都连边才能加进去,所以可以直接用\(\&\)运算来判断一个结点是否能加进去后还形成团,用优先队列来维护前k小的团的权值。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=1e5+10;
int n,k,w[110];
typedef bitset<110> bit;
bit e[110];
struct ppo{
bit x;
ll val;
bool operator <(const ppo &r)const{
return val>r.val;
}
};
bool cmp(int x,int y){
return w[x]<w[y];
}
int main(){
//ios::sync_with_stdio(false);
//freopen("in","r",stdin);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int j=0;j<s.size();j++){
e[i][j+1]=s[j]-'0';
}
}
priority_queue<ppo>q;
bit xxg;
xxg.reset();
q.push(ppo{xxg,0});
vector<ll>v;
while(!q.empty()){
ppo u=q.top();
v.pb(u.val);
if(v.size()>k) break;
q.pop();
int z=1;
for(int i=1;i<=n;i++){
if(u.x[i]) z=i+1;
}
for(int i=z;i<=n;i++){
if(u.x[i]==1) continue;
bit ret=e[i]&u.x;
if(ret==u.x){
ret[i]=1;
q.push(ppo{ret,u.val+w[i]});
}
}
}
sort(v.begin(), v.end());
if(v.size()<k) puts("-1");
else printf("%lld\n",v[k-1]);
return 0;
}

最新文章

  1. Python学习路程day2
  2. 修改Tomcat服务器的端口号
  3. GitHub详细教程(转载)
  4. springmvc前后端传值
  5. 转载—“Cache-control”常见的取值有private、no-cache、max-age、must-revalidate等
  6. UI进阶 动画
  7. Oracle系列之游标
  8. css3绘制中国结
  9. 十五、命令(Command)模式--行为型模式(Behavioral Pattern)
  10. jar文件につぃて
  11. Myexclipse创建Junit测试
  12. linux下将eclipse项目转换为gradle项目
  13. c++ typeid
  14. openWRT报错
  15. 转:【专题十二】实现一个简单的FTP服务器
  16. [osg]OSG使用更新回调来更改模型
  17. yii NAV x下拉
  18. Android 常用动画之RotateAnimation
  19. en_a
  20. CSS样式命名规则

热门文章

  1. pb datawindow 类型
  2. paramiko-ssh实例
  3. dgv数据绑定后,添加行遇到过的问题并解决
  4. 【weixi】微信支付---微信公众号JSAPI支付
  5. 异常-try...catch的方式处理异常1
  6. vue axios异步请求django
  7. MySQL数据库 、数据表、数据的增删改查简版
  8. 在values中添加colors.xml
  9. zencart产品批量表上传后SEO三要素状态以及特价时间修改
  10. 转PostgreSQL 用游标优化的一个例子