HDU 5952 Counting Cliques 图DFS

来源:互联网 发布:怎么样做淘宝服装模特 编辑:程序博客网 时间:2024/05/29 17:48

为了避免在搜索时重复,用了一种特殊的建图方式,即从编号小的边连向编号大的边.
因为所求的是无向完全图的个数,在无向完全图中只能找到一条符合v1

#include<bits/stdc++.h>using namespace std;const int MAXN=105;const int MAXM=1005;int V[MAXM],First[MAXN],Next[MAXM],Cnt;int T,N,M,S,Ans,Cur[MAXN];bool G[MAXN][MAXN];void Init(){    Cnt=0;    Ans=0;    memset(First,-1,sizeof(First));    memset(Next,-1,sizeof(Next));    memset(G,false,sizeof(G));}void AddEdge(int u,int v){    V[Cnt]=v;    Next[Cnt]=First[u];    First[u]=Cnt++;}void Dfs(int u){    if (Cur[0]==S)    {        Ans++;        return;    }    for (int i=First[u];i!=-1;i=Next[i])    {        int v=V[i],flag=1;        for (int j=1;j<=Cur[0];j++)        {            if (!G[v][Cur[j]])            {                flag=0;                break;            }        }        if (flag)        {            Cur[0]++;            Cur[Cur[0]]=v;            Dfs(v);            Cur[0]--;        }    }}int main(){    scanf("%d",&T);    while (T--)    {        Init();        int a,b;        scanf("%d%d%d",&N,&M,&S);        for (int i=0;i<M;i++)        {            scanf("%d%d",&a,&b);            if (a>b)                swap(a,b);            AddEdge(a,b);            G[a][b]=G[b][a]=true;        }        for (int i=1;i<=N;i++)        {            Cur[0]=1;            Cur[1]=i;            Dfs(i);        }        printf("%d\n",Ans);    }    return 0;}
0 0