hdu 5952 Counting Cliques

http://acm.split.hdu.edu.cn/showproblem.php?pid=5952



给出一个无向图,求有多少个子团,子团就是集合中的点到其他点都是直接相连的
这道题虽然是无向图,但在建图的时候需要看作是有向图,且要保证起点小于终点,然后再dfs去找有多少个团。将起点小于终点的原因是为了防止1234和2134这种类型的重复。



#include<iostream>  
#include<cstring>  
#include<iomanip>  
#include<algorithm>  
#include<cmath>  
#include<cstdio>  
#include<queue>  
#include<vector>
using namespace std;  
vector<int> st[111];
bool ma[111][111];
int ans;
int s;
void dfs(int u,int * vis,int siz)
{
	if(siz==s)
	{
		ans++;
		return ;
	}bool flag;
	for(int i=0;i<st[u].size();i++)
	{
		int ed=st[u][i];
		 flag=1;
		for(int j=1;j<=siz;j++)
		{
			if(!ma[vis[j]][ed])
			{
				flag=false;
				break;
			}
		}
		if(flag)
		{
			siz++;
			vis[siz]=ed;
			dfs(ed,vis,siz);
			vis[siz]=0;
			siz--;
		}
	}
}
int main(){  
int t;
        scanf("%d",&t);
		while(t--)  
        {  
          int po,ed;
          scanf("%d%d%d",&po,&ed,&s);
		  ans=0;
          int i;
          int u,v;
          memset(ma,0,sizeof(0));
          for(i=1;i<=po;i++)st[i].clear();
          while(ed--)
          {
          	scanf("%d%d",&u,&v);
          	if (u>v) swap(u,v);
          	st[u].push_back(v);
          	ma[u][v]=ma[v][u]=1;
	}
		  for(i=1;i<=po;i++)
		  {
		  	 int vis[111];
		  	 vis[1]=i;
		  	 dfs(i,vis,1);
		  }
		  printf("%d\n",ans);
        }
    
    return 0;  
} 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值