HDU 5952 Counting Cliques(dfs)

来源:互联网 发布:网络机柜检验报告 编辑:程序博客网 时间:2024/05/21 07:07

题意:

给出一个图,询问有多少个大小为s的完全图

思路:

题中给出提示,数据很小,而且每个点的边也不多,在搜的时候枚举一点,之后用新加的点与之前的点做一个判断,如果都有边就继续搜,否则退出

#include <stdio.h>#include <vector>#include <algorithm>#include <cstring>using namespace std;const int maxn=105;vector<int>vec[maxn];int mp[maxn][maxn];int n,m,s;int ans;int vis[maxn];int cnt;void dfs(int u,int ced){    if(ced==s)    {        ans++;        return ;    }    for(int i=0;i<vec[u].size();i++)    {        int t=vec[u][i];        int ok=1;        for(int j=1;j<=ced;j++)        {            int v=vis[j];            if(mp[v][t]==0)            {                ok=0;                break;            }        }        if(ok)        {           vis[ced+1]=t;           dfs(t,ced+1);           vis[ced+1]=0;        }    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(mp,0,sizeof(mp));        ans=0;        scanf("%d%d%d",&n,&m,&s);        for(int i=1;i<=n;i++)            vec[i].clear();        for(int i=1;i<=m;i++)        {            int u,v;            scanf("%d%d",&u,&v);            if(u>v)                swap(u,v);            mp[u][v]=mp[v][u]=1;            vec[u].push_back(v);        }        for(int i=1;i<=n;i++)        {            vis[1]=i;            dfs(i,1);            vis[1]=0;        }        printf("%d\n",ans);    }}


原创粉丝点击