题目链接: 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;
}