题目链接:点击打开链接
题解思路:一开始直接每个枚举T了,后来直接找有连接的居然过了 = =。每次看这个点是否能加入这个团,然后分加入和不加入两种情况dfs就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx = 1e2+10;
int n,m,k,top,ans,tot,head[mx*10];
bool edge[mx][mx];
int num[mx];
struct node{int y;int nxt;node(){}node(int yy,int nx):y(yy),nxt(nx){}
}Edge[mx*20];
void AddEdge(int x,int y)
{Edge[tot] = node(y,head[x]);head[x] = tot++;
}
bool check(int x)
{for(int i=0;i<top;i++)if(!edge[x][num[i]]) return 0;return 1;
}
void dfs(int x)
{if(top==k){ans++;return ;}for(int i=head[x];~i;i=Edge[i].nxt){int son = Edge[i].y;if(!check(son)) continue;num[top++] = son;dfs(son);top--;}
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);int a,b;tot = top = ans = 0;memset(edge,0,sizeof(edge));memset(head,-1,sizeof(head));for(int i=0;i<m;i++){scanf("%d%d",&a,&b);edge[a][b] = edge[b][a] = 1;if(a>b) swap(a,b);AddEdge(a,b);}for(int i=1;i<=n;i++){num[0] = i;top = 1;dfs(i);}printf("%d\n",ans);}return 0;
}