题意:
在一个图中计算大小为s的团有多少个。
思路:
直接暴力搜索,但是要注意搜的过程很显然会出现重复,这时候我们搜索的时候其实可以选择每次新加入的点要比当前的已经完成的子图中的点要大,这样就可以避免枚举的时候出现重复,既然这样可行,我们可以换一种思路,直接在建图的时候只保存由小点指向大点的单向边即可,很巧妙。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 105;
int n, m, s, ans;
vector <int> G[MAXN];
bool mp[MAXN][MAXN];
int st[MAXN];
void dfs(int u, int num) {
if (num == s) {
++ans;
return;
}
int cnt = G[u].size();
for (int i = 0; i < cnt; i++) {
int v = G[u][i];
bool flag = true;
for (int j = 0; j < num; j++) {
if (!mp[v][st[j]]) {
flag = false;
break;
}
}
if (flag) {
st[num] = v;
dfs(v, num + 1);
}
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &m, &s);
memset(mp, false, sizeof(mp));
for (int i = 1; i <= n; i++) G[i].clear();
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
mp[u][v] = mp[v][u] = true;
}
ans = 0;
for (int u = 1; u <= n; u++) {
st[0] = u;
dfs(u, 1);
}
printf("%d\n", ans);
}
return 0;
}