您的位置:首页 > 产品设计 > UI/UE

HDU 5952 Counting Cliques 图DFS

2016-11-13 14:44 363 查看
为了避免在搜索时重复,用了一种特殊的建图方式,即从编号小的边连向编号大的边.

因为所求的是无向完全图的个数,在无向完全图中只能找到一条符合v1

#include<bits/stdc++.h>
using namespace std;
const int MAXN=105;
const int MAXM=1005;
int V[MAXM],First[MAXN],Next[MAXM],Cnt;
int T,N,M,S,Ans,Cur[MAXN];
bool G[MAXN][MAXN];
void Init()
{
Cnt=0;
Ans=0;
memset(First,-1,sizeof(First));
memset(Next,-1,sizeof(Next));
memset(G,false,sizeof(G));
}
void AddEdge(int u,int v)
{
V[Cnt]=v;
Next[Cnt]=First[u];
First[u]=Cnt++;
}
void Dfs(int u)
{
if (Cur[0]==S)
{
Ans++;
return;
}
for (int i=First[u];i!=-1;i=Next[i])
{
int v=V[i],flag=1;
for (int j=1;j<=Cur[0];j++)
{
if (!G[v][Cur[j]])
{
flag=0;
break;
}
}
if (flag)
{
Cur[0]++;
Cur[Cur[0]]=v;
Dfs(v);
Cur[0]--;
}
}
}
int main()
{
scanf("%d",&T);
while (T--)
{
Init();
int a,b;
scanf("%d%d%d",&N,&M,&S);
for (int i=0;i<M;i++)
{
scanf("%d%d",&a,&b);
if (a>b)
swap(a,b);
AddEdge(a,b);
G[a][b]=G[b][a]=true;
}
for (int i=1;i<=N;i++)
{
Cur[0]=1;
Cur[1]=i;
Dfs(i);
}
printf("%d\n",Ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: