1.​​题目链接​​。图的完全子图计数。

2.搜索一下就完事,对于每个点搜一下。代码中关键地方注释了一下,很好看懂。

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 110;
vector<int>G[MAXN];
int mp[MAXN][MAXN];
int n, m, s, T;
int ans;
void dfs(int u, int* tmp, int size)
{
if (size == s)
{
ans++;
return;
}
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
bool flag = 1;
//如果发现当前的点和团里面所有的点都有边,那么就可以加入团
for (int j = 1; j <= size; j++)
{
if (!mp[v][tmp[j]])
{
flag = 0;
break;
}
}
if (flag)
{
//把当前点加入
tmp[++size] = v;
dfs(v, tmp, size);
tmp[size--] = 0;//回溯一下。
}
}
}
int main()
{
scanf("%d", &T);
while(T--)
{
ans = 0;
for (int i = 0; i < MAXN; i++)G[i].clear();

memset(mp, 0, sizeof(mp));
scanf("%d%d%d", &n, &m, &s);

for (int i = 1; i <= m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
if (u > v)swap(u, v);
G[u].push_back(v);
mp[u][v] = mp[v][u] = 1;
}
for (int i = 1; i <= n; i++)
{
int size = 1;
int tmp[MAXN];//这个数组至关重要,他是表明了当前的团都有那些点。
tmp[1] = i;
dfs(i, tmp, size);
}
cout << ans << endl;
}
}