题目链接:点击打开题目
数据不是很大,直接爆搜就行了。
代码如下:
#include<queue>
#include<cmath>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
#define CLR(a,b) memset(a,b,sizeof(a))
#define PI acos(-1.0)
int n,m,c;
bool Edge[105][105];
vector<int> E[105];
vector<int> Vertex;
int ans;
bool check(int k)
{
for (int i = 0 ; i < Vertex.size() ; i++)
{
if (!Edge[Vertex[i]][k])
return false;
}
return true;
}
void dfs(int pos)
{
if (Vertex.size() == c)
{
ans++;
return;
}
for (int i = 0 ; i < E[pos].size() ; i++)
{
if (check(E[pos][i]))
{
Vertex.push_back(E[pos][i]);
dfs(E[pos][i]);
Vertex.pop_back();
}
}
}
int main()
{
int T;
scanf ("%d",&T);
while (T--)
{
scanf ("%d %d %d",&n,&m,&c);
ans = 0;
Vertex.clear();
for (int i = 1 ; i <= n ; i++)
{
E[i].clear();
for (int j = 1 ; j <= n ; j++)
{
Edge[i][j] = false;
}
}
for (int i = 1 ; i <= m ; i++)
{
int x,y;
scanf ("%d %d",&x,&y);
if (x > y)
swap(x,y);
E[x].push_back(y);
Edge[x][y] = Edge[y][x] = true;
}
for (int i = 1 ; i <= n-c+1 ; i++)
{
Vertex.push_back(i);
dfs(i);
Vertex.clear();
}
printf ("%d\n",ans);
}
return 0;
}