【算法系列学习】巧妙建图,暴搜去重 Counting Cliques
http://blog.csdn.net/eventqueue/article/details/52973747
http://blog.csdn.net/yuanjunlai141/article/details/52972715
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue> using namespace std;
const int maxn=;
const int maxm=1e3+;
int n,m,s;
int deg[maxn];
int mp[maxn][maxn];
int Stack[maxn];
int ans;
struct Edge
{
int to;
int next;
}edge[maxm];
int tot,head[maxn];
void add(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
void Init()
{
ans=;
tot=;
memset(head,-,sizeof(head));
memset(deg,,sizeof(deg));
memset(mp,,sizeof(mp));
memset(Stack,,sizeof(Stack));
}
bool judge(int a[],int v)
{
for(int i=;i<=a[];i++)
{
if(!mp[v][a[i]])
{
return false;
}
}
return true;
}
void DFS(int a[],int u)
{
if(a[]==s)
{
ans++;
return;
}
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
//判断这个点是不是和每个已有团结点都有边
if(judge(a,v))
{
//入栈
a[++a[]]=v;
DFS(a,v);
a[]--;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
Init();
scanf("%d%d%d",&n,&m,&s);
int u,v;
for(int i=;i<m;i++)
{
scanf("%d%d",&u,&v);
//这是去重的关键
/*用一个数组记录已经存在的团的大小,数组是一个由小到大
的数组,即前点要进入团时,判断该节点是否比团内所有点大,这样就避免了重复,判断大小时只需要判断进最后一个点是否比当前点小就行了
所以建图是可以按照 小的点指向大的点得方式建图,这样会少很多不必要的搜索操作 */
/*之所以可以从小的节点指向大的节点是因为,最后要找的是一个无向完全图,在无向完全图中肯定可以找到一条从小节点依次走到到大节点的有向路:比如1->2->3这样的路,边的双向信息用另一个数组存一下就行了 这样就减少了大量不必要的计算,而且不会重复,因为你在一个无向完全图里只可能找到一个,v1 < v2 < v3 ... < vx
这样的偏序关系的路,不可能再出现例如v2 < v1 < v3 < ... < vx这种路,因为这么多点大小的偏序关系是唯一的,确定了一次,以后都不会重复了,连标记去重都不用,真巧妙!*/
if(u>v)
{
swap(u,v);
}
add(u,v);
mp[u][v]=mp[v][u]=;
//为了剪枝
deg[u]++;
deg[v]++;
}
for(int i=;i<=n;i++)
{
//剪枝,度小于s-1的一定不在团内
if(deg[i]<s-)
{
continue;
}
//模拟栈,Stack[0]保存已经确定的团结点的大小
Stack[]=;
Stack[]=i;
DFS(Stack,i);
}
printf("%d\n",ans);
}
return ;
}
【算法系列学习】巧妙建图,暴搜去重 Counting Cliques的更多相关文章
- HDU5772 String problem 最大权闭合图+巧妙建图
题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...
- 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)
传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...
- UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)
UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...
- [ACM] POJ 3686 The Windy's (二分图最小权匹配,KM算法,特殊建图)
The Windy's Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4158 Accepted: 1777 Descr ...
- HDU5521 Meeting(dijkstra+巧妙建图)
HDU5521 Meeting 题意: 给你n个点,它们组成了m个团,第i个团内有si个点,且每个团内的点互相之间距离为ti,问如果同时从点1和点n出发,最短耗时多少相遇 很明显题目给出的是个无负环的 ...
- BZOJ4152 The Captain(dijkstra+巧妙建图)
BZOJ4152 The Captain 题面很简洁: 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 很明显 ...
- 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜
3033: 太鼓达人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 204 Solved: 154[Submit][Status][Discuss] ...
- poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙
/** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...
- hdu 5952 Counting Cliques 求图中指定大小的团的个数 暴搜
题目链接 题意 给定一个\(n个点,m条边\)的无向图,找出其中大小为\(s\)的完全图个数\((n\leq 100,m\leq 1000,s\leq 10)\). 思路 暴搜. 搜索的时候判断要加进 ...
随机推荐
- win7下Apache2.4安装、配置及服务自启动
为了测试微信平台接口,在电脑上安装的Apache服务器,把安装步骤记下来以后备用 第一篇文章,不好请见谅 Apache2.4.17下载地址:http://www.apachelounge.com/do ...
- 卸载php+apache+mysql
一.卸载删除 mysql 1 sudo apt-get autoremove --purge mysql-server-5.0 2 sudo apt-get remove mysql-server ...
- C语言之一天一个小程序
程序示例: #include <stdio.h> #include <stdlib.h> int main() { printf("Hello,world!\n&qu ...
- Windows7 java-jdk1.7安装及设置变量过程
jdk安装的次数较少,容易忘记,这里专门记录一下. 1:jdk1.7网上到处都是可以随便下载一个.然后进行安装,不过在安装过程中把安装路径单独记忆一下,在配置变量的时候会用到. 2:安装完JDK后配置 ...
- Android Things教程:电气基础之直流电路理论
译者注:由于本人水平有限,译文中难免会出现概念模糊.晦涩难懂,如果实在没心思看下去,请发挥你的学习能动性,到原文中自行翻译,感谢!!!点这里,直达英文各种长句的世界. 好了,既然你选择继续往下看,那就 ...
- CentOs6系统安装mailx发邮件
1. yum -y mail* sendmail* postfix* service sendmail start 2. cp /etc/mail.rc /etc/mail.rc.bak cat &g ...
- 译:Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息
注: 本文译自https://www.sqlskills.com/blogs/paul/missing-index-dmvs-bug-that-could-cost-your-sanity/ 原文作者 ...
- EventBus通信小能手
1.EventBus简介 EventBus 是由 greenrobot 组织开发的一个 Android 事件发布/订阅轻量级框架,特点:代码简洁,是一种发布订阅设计模式(观察者设计模式). Even ...
- [SinGuLaRiTy] 组合数学
[SinGuLaRiTy-1005] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved . 加法原理 设事件A有m种产生方式,事件B有n种产生方式 ...
- Activiti的全局事件机制及其监听处理
概述 Activiti在5.15以后的版本后,增加了统一的事件入口,不需要再像以前那样,监听流程的事件时,在流程定义的BPMN文件中为每个节点及流程增加以下的配置,以实现监听事件的做法,这种做法导致我 ...