HDU 5952 Counting Cliques 爆搜+剪枝+无向转单调有向 2016ACM/ICPC亚洲区沈阳站 E题

题意:

给你一个N阶M边的无向图,求图中K阶完全子图(圈图)的个数。

思路:

只能爆搜了,但是要注意剪枝。按无向的做法会超时,改成单调有向的做(只保存小点指向大点的边)

代码:(1762MS)

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;

int T,n,m,ans,k,x,y,to;
const int MAXN=105;
bool imap[MAXN][MAXN];		//imap邻接矩阵,用于直接判断边的关系
int edge[MAXN];			//edge表示关联边的个数
int mark[MAXN];			//mark保存搜索过程中当前子图中的点
int mp[MAXN][MAXN];		//mp邻接表保存边的关系
int check(int P,int step){	//检查新搜索到的点是否满足完全图
    for(int i=step;i>0;i--){
        if(!imap[mark[i]][P])
            return 0;
    }
    return 1;
}
void dfs(int st,int step){	//爆搜
    if(step==k){
        ans++;
        return ;
    }
    for(int i=0;i<edge[st];i++){
        to=mp[st][i];
        if(edge[to]>=k-step-1&&check(to,step)){	//剪枝1:(1)如果比这个点大的点个数小于剩下需要的点的个数则剪枝
            mark[step+1]=to;                    //       (2)如果点不符合完全图条件则剪枝
            dfs(to,step+1);
        }
    }
    return ;
}
void ini(){
    scanf("%d%d%d",&n,&m,&k);
    memset(edge,0,sizeof(edge));
    memset(imap,0,sizeof(imap));
    memset(mp,0,sizeof(mp));
    for(int i=0;i<m;i++){
        scanf("%d%d",&x,&y);
        if(x>y) swap(x,y);  //转无向图为有向图
        imap[x][y]=1;       //只保存小点对大点
        mp[x][edge[x]++]=y;
    }
    return ;
}
void solve(){
    ans=0;
    for(int i=1;i<=n-k+1;i++){  //剪枝2:由于是小点对大点,所以子图中最小的点最大是n-k+1
        if(edge[i]>=k-1){       //剪枝3:同剪枝1(1)
            mark[1]=i;
            dfs(i,1);
        }
    }
    printf("%d\n",ans);
    return ;
}
int main(){
    ios::sync_with_stdio(false);
    scanf("%d",&T);
    while(T--){
        ini();
        solve();
    }
    return 0;
}

Description

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. 

Input

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.

Output

For each test case, output the number of cliques with size S in the graph.

Sample Input

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

Sample Output

3
7
15




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值