Counting Cliques

HDU - 5952

OJ-ID:
hdu-5952

author:
Caution_X

date of submission:
20191110

tags:
dfs,graph

description modelling:
给定点数,边数,问包含有x个点的完全图种类数

major steps to solve it:
(1)选择一个点作为起点,记录该起点的所有连通点,dfs(该点)此时完全图有两个点
(2)遍历(1)中选定点的连通点,若构成完全图,则dfs(能够与(1)的图构成完全图的点)此时完全图有三个点 以此类推 当完全图点数=x时结束dfs
(3)重复(2)操作直到所有点都被作为起点使用过

warnings:
因为每一个起点都满足含有[2,x]个点的完全图,因此,不同起点达到x个点时的完全图相互独立

AC code:

#include<cstdio>
#include<algorithm>
#include<string.h>
#include<bitset>
using namespace std;
const int maxn = ;
int s,ans;
bool mp[maxn][maxn];
/*
这里的dfs看起来很简单,其实包含了一个很大的剪枝:在遍历某个点的时候,已经确定了已经加入团的点是与这个点相连的,还可以知道平均下来每个点的入度不会超过20,
因此整个遍历的复杂度最高是C(9,20)*100
*/
void dfs(int mx,int v[],int cnt){
int nxt[maxn];
if(cnt==s) {ans++;return;}
for(int i=;i<mx;i++){ //枚举能与点数为cnt的团构成点数为cnt+1的团的所有点
int len=;
for(int j=i+;j<mx;j++){
if(mp[v[i]][v[j]]){ //该团的所有"候选点"必须与已经选了的点相连
nxt[len++]=v[j];
}
}
dfs(len,nxt,cnt+);
}
}
int main(){
int T,n,m,u,v;
// freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&s);
memset(mp,,sizeof(mp));
for(int i=;i<m;i++){
scanf("%d%d",&u,&v);
mp[u][v]=mp[v][u]=;
}
ans=;
int nxt[];
for(int i=;i<=n;i++){ //枚举每个点,这个点必须在所求的团里面,以这个点开始搜索
int len=;
for(int j=i+;j<=n;j++){
if(mp[i][j]){ //该团的所有"候选点"必须与已经选了的点相连
nxt[len++]=j;
}
}
dfs(len,nxt,);
}
printf("%d\n",ans);
}
return ;
}

HDU - 5952 Counting Cliques的更多相关文章

  1. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. HDU 5952 Counting Cliques(dfs)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. HDU - 5952 Counting Cliques(DFS)

    A clique is a complete graph, in which there is an edge between every pair of the vertices. Given a ...

  4. HDU - 5952 Counting Cliques(dfs搜索)

    题目: A clique is a complete graph, in which there is an edge between every pair of the vertices. Give ...

  5. hdu 5952 Counting Cliques 求图中指定大小的团的个数 暴搜

    题目链接 题意 给定一个\(n个点,m条边\)的无向图,找出其中大小为\(s\)的完全图个数\((n\leq 100,m\leq 1000,s\leq 10)\). 思路 暴搜. 搜索的时候判断要加进 ...

  6. hdu 5862 Counting Intersections

    传送门:hdu 5862 Counting Intersections 题意:对于平行于坐标轴的n条线段,求两两相交的线段对有多少个,包括十,T型 官方题解:由于数据限制,只有竖向与横向的线段才会产生 ...

  7. HDU 5862 Counting Intersections(离散化+树状数组)

    HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...

  8. 【算法系列学习】巧妙建图,暴搜去重 Counting Cliques

    E - Counting Cliques http://blog.csdn.net/eventqueue/article/details/52973747 http://blog.csdn.net/y ...

  9. hdu 5952 连通子图

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. Selenium使用方法整理

    我采用的是Python来使用selenium库,同时java也可以使用,但不如python操作起来方便.下文都会以python的操作为例子,整理我学习selenium过程中收集到的方法. 一:安装 首 ...

  2. Kubernetes基本概念和术语之《Master和Node》

    Kubernetes中的大部分概念如Node.Pod.Replication Controller.Service等都可以看作一种“资源对象”,几乎所有的资源对象都可以通过Kubernetes提供的k ...

  3. 初探three.js几何体

    今天说说three.js的几何体,常见的几何体今天就不说了,今天说一说如何画直线,圆弧线,以及高级几何体. 1. 画一条直线 画直线我们使用THREE.Geometry()对象. //给空白几何体添加 ...

  4. java 反射的意义

    具体的关于反射的介绍可以参考我的另外一篇博文<深入解析java反射>. 反射的意义是什么,其实就是为了代码简洁,提高代码的复用率,外部调用方便,源代码,反编译都能看到. 某些情况下解耦用反 ...

  5. java8-Stream流API

    一回顾与说明 经过前面发布的三章java8的博客,你就懂得了我们为什么要用Lamda表达式,Lamda表达式的原理与函数式接口的关系,从Lamda表达式到方法引用和构造引用. 想要学Stream流你必 ...

  6. mySql的case when用法

    背景 有点忘了,记录下 写法一 case colume when condition then result when condition then result when condition the ...

  7. vue-其他

    vue-resource // 2.1 导入 vue-resource import VueResource from 'vue-resource' // 2.2 安装 vue-resource Vu ...

  8. vue & nodejs jwt 的基于token身份验证

    现在比较流行的验证方式,是带着token的登录验证 原理 1. 登陆时,客户端发送用户名密码 2. 服务端验证用户名密码是否正确,校验通过就会生成一个有时效的token串,发送给客户端 3. 客户端储 ...

  9. windows下MySQL解压版安装

    MySQL的安装 一.前期准备 获取MySQL解压版安装包(本文使用的是 [mysql-5.7.28-winx64.zip]版本) 获取方式: 通过官网下载,官方下载地址:“https://dev.m ...

  10. 面试连环炮系列(二):你们的项目Redis做了集群部署吗

    你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案 ...