链接:https://ac.nowcoder.com/acm/contest/882/D
来源:牛客网

Given a vertex-weighted graph with N vertices, find out the K-th minimum weighted clique.

A subset of vertices of an undirected graph is called clique if and only if every two distinct vertices in the subset are adjacent. The weight of a clique is the summation of the weight of vertices in it.

题意:给定一个无向图领接矩阵,每个点有权值,找出权值第k小的团的权值(一个团就是图的一个完全子图)

解题思路:显然的,我们可以知道最小的团就是那个空的完全图,也就是0阶完全子图,由此启发,我们可以从这个最小的团生成第二小,第三小...的团,因为第二小,第三小...的团是由这个空团加入点生成的,这里很明显是一种广度优先搜索的思路

但是,我们如何使得每次出队的团都是按照第n小,第n+1小这样的顺序来呢?很明显,由于每个点有权值,而团的大小的定义是点的权值和大小,并不是点的个数,因此这个地方,我们用优先队列实现,

小团优先出队列,这样将可以保证出队的团的顺序是按照团的大小顺序,由小到大,因为每个团生成新的团一定会更大,所以第n次出队时堆顶的团一定是第n小的团,模拟这个BFS过程我们就可以得到第k小的团。

PS:这个题通过bitset表示团和每个点所连接的所有点,实现优化

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k;
ll val[105];
bitset<105> sta[105];//状态压缩,表示i相连的所有点
struct node
{
ll w;
int id;//记录当前团最后加入的点编号,当前团只加入最后加入点之后的点,达到去重的目的
bitset<105> clique;
friend bool operator<(const node& a,const node&b)
{
return a.w>b.w;
}
};
priority_queue<node>q;
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin>>val[i];
}
int x;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
scanf("%1d",&x);
sta[i][j]=x;
}
ll ans=-1;
node st;
st.id=0;
st.w=0;
q.push(st);
while (!q.empty())
{
node now = q.top();
q.pop();
k--;
if(!k)
{
ans=now.w;
break;
}
for(int i=now.id+1;i<=n;i++)
{
if((now.clique&sta[i])==now.clique)//说明点i与当前团中的点都相连
{
node next;
next.id=i;
next.clique=now.clique;
next.clique[i]=1;
next.w=now.w+val[i];
q.push(next);
}
}
}
cout<<ans<<endl;
return 0;
}

总结:这个题的本质是把DFS找最大团的过程解析出来,通过优先队列维护得到的团,获得第k小的团。

牛客网多校训练第二场D Kth Minimum Clique的更多相关文章

  1. 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...

  2. 牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)

    链接: https://www.nowcoder.com/acm/contest/139/J 题意: 给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R( ...

  3. 牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)

    链接: https://www.nowcoder.com/acm/contest/139/F 题意: 分析: 转载自:http://tokitsukaze.live/2018/07/19/2018ni ...

  4. 牛客网多校训练第一场 E - Removal(线性DP + 重复处理)

    链接: https://www.nowcoder.com/acm/contest/139/E 题意: 给出一个n(1≤n≤1e5)个整数(范围是1至10)的序列,求从中移除m(1≤m≤min(n-1, ...

  5. 牛客网多校训练第一场 D - Two Graphs

    链接: https://www.nowcoder.com/acm/contest/139/D 题意: 两个无向简单图都有n(1≤n≤8)个顶点,图G1有m1条边,图G2有m2条边,问G2有多少个子图与 ...

  6. 牛客网多校训练第一场 B - Symmetric Matrix(dp)

    链接: https://www.nowcoder.com/acm/contest/139/B 题意: 求满足以下条件的n*n矩阵A的数量模m:A(i,j) ∈ {0,1,2}, 1≤i,j≤n.A(i ...

  7. 牛客网多校训练第一场 A - Monotonic Matrix(Lindström–Gessel–Viennot lemma)

    链接: https://www.nowcoder.com/acm/contest/139/A 题意: 求满足以下条件的n*m矩阵A的数量模(1e9+7):A(i,j) ∈ {0,1,2}, 1≤i≤n ...

  8. 牛客网多校训练第九场H Cutting Bamboos

    题目链接:https://ac.nowcoder.com/acm/contest/889/H 题意:给出n颗竹子的高度,q次询问,每次询问给出l,r,x,y,每次选取[l,r]中的竹子,砍y次砍掉所有 ...

  9. 牛客网多校第3场C-shuffle card 平衡树或stl(rope)

    链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...

随机推荐

  1. 机器学习中python的有关使用技巧【创建虚拟环境、jupyter的kernel修改】

    1.创建虚拟环境<在原来基础上建立> *注:(这里是python2.python3环境共存,我要创建一个python3的虚拟环境) 一.先安装虚拟环境变量: pip3 install -U ...

  2. java文件上传方式1servlet 方式2springmvc

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  3. 2、使用siege进行服务端性能测试

    先查看siege帮助 输入siege -h 翻译一下常用命令 -c 指定并发数 -r 指定重复次数 -d 指定请求的延迟时间,注意每个请求间随机延迟 -f 指定url列表,可以一次给多个地址加压 -t ...

  4. 【react】---Hooks的基本使用---【巷子】

    一.react-hooks概念 React中一切皆为组件,React中组件分为类组件和函数组件,在React中如果需要记录一个组件的状态的时候,那么这个组件必须是类组件.那么能否让函数组件拥有类组件的 ...

  5. 剑指offer——48把数字翻译成字符串

    题目要求: 给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”.一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcf ...

  6. 重大利好,Dubbo 3.0要来了。

    关于Dubbo的好消息,2018年1月8日,Dubbo创始人之一梁飞在Dubbo交流群里透露了Dubbo 3.0正在开工的重大消息. Dubbo是阿里开源的分布式框架,已经多年停止更新处于半死不活状态 ...

  7. 移动端新建html页面

    这是一些头部设置 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  8. hdu6395 /// 优先队列dijkstra

    题目大意: 给定无向图的n m为点数和边数 接下来m行给定u v id表示点u到点v间有一条编号为id的边 当由一条边走到另一条边 而两条边的编号不同时 费用+1 优先队列跑dijkstra最短路 按 ...

  9. SingalR 构建 推送服务器初探

    项目需要用到推送,于是重新研究了下推送框架,最好能够独立成一个服务,与业务无关的服务,可以给所有的项目通用.找了好久最终决定用SinglR 框架. Signal 是微软支持的一个运行在 Dot NET ...

  10. Vue双向数据绑定原理深度解析

    首先,什么是双向数据绑定?Vue是三大MVVM框架之一,数据绑定简单来说,就是当数据发生变化时,相应的视图会进行更新,当视图更新时,数据也会跟着变化. 在分析其原理和代码的时候,大家首先了解如下几个j ...