題目鏈接:hdu 5952 Counting Cliques
題目大意
n≤100 個點,m≤1000 條邊的圖,求大小恰好是 s≤10 的團的數量。
解題思路
因爲題目中已經說了每個點的度不超過20,並且
AC代碼
#include <cstdio>
#include <cstring>
const int MX = 1e3+5;
int m[MX][MX],head[MX],IN[MX],ans,e;
struct Edge{
int v,nxt;
}E[MX<<2];
void init()
{
ans = 0;
e=0;memset(IN,0,sizeof IN);
memset(head,-1,sizeof head);
memset(m,0,sizeof m);
}
void add(int u,int v)
{
E[e].v =v;
E[e].nxt = head[u];
head[u] = e++;
}
void DFS(int siz,int *A,int u,int s)
{
if(siz==s) {
ans++;
return ;
}
for(int i=head[u];~i;i=E[i].nxt) {
int v = E[i].v; bool flag = true;
for(int j=1;j<=siz;j++) {
if(!m[v][A[j]]) {
flag = false;
break;
}
}
if(flag) {
siz++;
A[siz] = v;
DFS(siz,A,v,s);
siz--;
}
}
}
void solve(int n,int s)
{
for(int i=1;i<=n;i++) {
int A[MX];memset(A,0,sizeof A);
A[1] = i;
DFS(1,A,i,s);
}
printf("%d\n",ans);
}
int main()
{
int T,N,M,S;freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--) {
init();
scanf("%d%d%d",&N,&M,&S);
while(M--) {
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
m[u][v] = m[v][u] = 1;
}
solve(N,S);
}
return 0;
}