HDU5952

来源:互联网 发布:corel 片头制作软件 编辑:程序博客网 时间:2024/05/19 10:09

题目链接:  HDU 5952

题意:给一个N个点M条边的的图, 求有多少个大小为S 的完全子图, (题目trick:一个点度最多为20),

          爆搜即可 (需要单向建图(U->V && u < v),这样会不重复)。

#include<bits/stdc++.h>using namespace std;bool vis[105][105];int head[1010];int cnt = 1;int SIZE = 0;int ans = 0;int n,m,s;int now[25];struct node{    int to, next;}edge[1010];void init(){    cnt = 1;    SIZE = 1;    ans = 0;    memset(now, 0, sizeof(now));    memset(vis,false, sizeof(vis));    for(int i=0;i<1010;i++)        head[i]=-1;}void addedge(int u, int v){    edge[cnt].to = v;    edge[cnt].next = head[u];    head[u] = cnt++;}bool check(int u){    for(int i = 1; i<= SIZE; i++)    {        if(!vis[now[i]][u])            return false;    }    return true;}void dfs(int point){    if(SIZE == s)    {        ans++;        return;    }    for(int i = head[point]; i != -1; i = edge[i].next)    {        int u = edge[i].to;        if(check(u))        {            now[++SIZE] = u;            dfs(u);            SIZE--;        }    }}int main(){    int t;    scanf("%d", &t);    while(t--)    {        init();        scanf("%d%d%d", &n, &m, &s);        int u, v;        while(m--)        {            scanf("%d%d", &u, &v);            addedge(u ,v);            vis[u][v] = vis[v][u] = 1;        }        SIZE = 1;        ans = 0;        //now = 1;        for(int i = 1 ; i <= n; i++)        {            SIZE = 0;            now[++SIZE] = i;            dfs(i);        }        printf("%d\n", ans );    }    return 0;}


原创粉丝点击