题意:给n点m条边无向图,问你有多少个大小为s的完全子图。
思路:因为100个点,所以可以爆搜每个点。但是直接爆搜会产生重复的问题,而且时限不够。观察发现对于4个点完全图我们搜索大小为3的子图会一次搜索,123,124,134,213,214,234......对于123和213这种情况,我们可以把图转换成有向图,编号小的点向编号大的点连边,记录下连通性即可。
#include <bits/stdc++.h>
using namespace std;
vector<int> q[105];
int m[105][105];
int s;int ans=0;
void dfs(int u,int *a,int size)
{
if(size==s)
{
ans++;return ;
}
for(int j=0;j<q[u].size();j++)
{
int v=q[u][j],flag=1;
for(int i=0;i<size;i++)
{
if(!m[a[i]][v]){
flag=0;break;
}
}
if(flag)
{
a[size++]=v;
dfs(v,a,size);
size--;
}
}
}
int a[105];
int main()
{
int t;scanf("%d",&t);
while(t--)
{
int n,mm;ans=0;
scanf("%d%d%d",&n,&mm,&s);
memset(m,0,sizeof(m));
for(int i=1;i<=n;i++) q[i].clear();
for(int i=1;i<=mm;i++)
{
int x,y;scanf("%d%d",&x,&y);
m[x][y]=m[y][x]=1;
if(x>y) swap(x,y);
q[x].push_back(y);
}
for(int i=1;i<=n;i++)
{
a[0]=i;
dfs(i,a,1);
}
printf("%d\n",ans);
}
return 0;
}