题意:给一个无向图,问大小为S的团有多少个。
直接暴力搜索,但是建图从小到大建能避免重复,然后dfs暴力枚举+判断
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int head[2005],top;
int map1[300][300];
struct node
{
int u,v,next;
}e[3000];
int sum[3000];
int n,m,k,ans;
void add(int u,int v)
{
e[top].u=u;
e[top].v=v;
e[top].next=head[u];
head[u]=top++;
}
void dfs(int num[],int x)
{
if(num[0]==k)
{
ans++;
return;
}
for(int i=head[x];i!=-1;i=e[i].next)
{
int v=e[i].v;
int flag=1;
for(int j=1;j<=num[0];j++)
{
if(!map1[num[j]][v])
{
flag=0;
break;
}
}
if(flag)
{
num[0]++;
num[num[0]]=v;
dfs(num,v);
num[0]--;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
memset(map1,0,sizeof map1);
memset(head,-1,sizeof head);
top=0;
ans=0;
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(min(x,y),max(x,y));
map1[x][y]=map1[y][x]=1;
}
for(int i=1;i<=n;i++)
{
sum[0]=1;
sum[1]=i;
dfs(sum,i);
}
printf("%d\n",ans);
}
}