hdu 5952 Counting Cliques

来源:互联网 发布:疯狂的美工助手注册码 编辑:程序博客网 时间:2024/05/18 09:29

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;  }