HDU-5952 Counting Cliques(16年ICPC沈阳赛区)(暴力DFS)
2016-11-01 01:31
561 查看
Counting Cliques
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 673 Accepted Submission(s): 264
[align=left]Problem Description[/align]
A clique is a complete graph, in which there is an edge between every pair of the vertices. Given a graph with N vertices and M edges, your task is to count the number of cliques with a specific size S in the graph.
[align=left]Input[/align]
The first line is the number of test cases. For each test case, the first line contains 3 integers N,M and S (N ≤ 100,M ≤ 1000,2 ≤ S ≤ 10), each of the following M lines contains 2 integers u and v (1 ≤ u < v ≤ N), which means there
is an edge between vertices u and v. It is guaranteed that the maximum degree of the vertices is no larger than 20.
[align=left]Output[/align]
For each test case, output the number of cliques with size S in the graph.
[align=left]Sample Input[/align]
3
4 3 2
1 2
2 3
3 4
5 9 3
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
6 15 4
1 2
1 3
1 4
1 5
1 6
2 3
2 4
2 5
2 6
3 4
3 5
3 6
4 5
4 6
5 6
[align=left]Sample Output[/align]
3
7
15
[align=left]Source[/align]
2016ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
题意:给出一个无向图,要求求出点的个数恰好为s的完全子图的数目
题解:(万能的)暴力,具体原理看代码吧= =
#include<cstdio> #include<algorithm> #include<string.h> #include<bitset> using namespace std; const int maxn = 105; 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=0;i<mx;i++){ //枚举能与点数为cnt的团构成点数为cnt+1的团的所有点 int len=0; for(int j=i+1;j<mx;j++){ if(mp[v[i]][v[j]]){ //该团的所有"候选点"必须与已经选了的点相连 nxt[len++]=v[j]; } } dfs(len,nxt,cnt+1); } } 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,0,sizeof(mp)); for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); mp[u][v]=mp[v][u]=1; } ans=0; int nxt[105]; for(int i=1;i<=n;i++){ //枚举每个点,这个点必须在所求的团里面,以这个点开始搜索 int len=0; for(int j=i+1;j<=n;j++){ if(mp[i][j]){ //该团的所有"候选点"必须与已经选了的点相连 nxt[len++]=j; } } dfs(len,nxt,1); } printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu 5952 Counting Cliques 2016ACM/ICPC沈阳赛区现场赛E
- hdu 5893 List wants to travel 2016ACM/ICPC沈阳赛区网络赛1002
- HDU - 6195 cable cable cable (2017 ACM-ICPC 亚洲区 (沈阳赛区) 网络赛 1002)
- HDU - 6197 array array array (2017 ACM-ICPC 亚洲区 (沈阳赛区) 网络赛 1004)
- HDU 5952 2016沈阳现场赛E Counting Cliques (团计数暴力)
- HDU 5512 2015ACM-ICPC沈阳赛区现场赛D题
- 【2016-沈阳赛区现场赛-E】暴搜(Counting Cliques,hdu 5952)
- hdu 5948 Thickest Burger 2016ACM/ICPC沈阳赛区现场赛A
- hdu 5892 List wants to travel 2016ACM/ICPC沈阳赛区网络赛1001
- HDU - 5952(暴力DFS)
- hdu 5950 2016ACM/ICPC沈阳赛区现场赛C题【矩阵快速幂】
- HDU - 6201 transaction transaction transaction (2017 ACM-ICPC 亚洲区 (沈阳赛区) 网络赛 1008)
- hdu 5900 QSC and Master -ICPC网络赛沈阳赛区-区间dp
- HDU 5521 2015ACM-ICPC沈阳赛区现场赛M题
- hdu 4272 2012长春赛区网络赛 dfs暴力 ***
- HDU - 6205 card card card (2017 ACM-ICPC 亚洲区 (沈阳赛区) 网络赛 1012)
- HDU - 5952 暴力dfs
- hdu 4584 building-bridge 暴力的题,怎么暴力怎么干。。2013 ACM-ICPC杭州赛区全国邀请赛——题目重现
- hdu 5898 odd even number(acm/icpc沈阳赛区网络赛,数位DP)
- hdu 5950 Recursive sequence 2016ACM/ICPC沈阳赛区现场赛C