DFS搜索+剪枝

来源:互联网 发布:sql身份证 编辑:程序博客网 时间:2024/05/18 11:49

hdu-5952

题意:给出一张无向图,然后判断这张图中一共有多少个不同的大小为S的完全图(完全图的顶点数为s个),题目保证每个点的度不大于20。

完全图:n个点两两之间都有一条边的图叫完全图。

思路:由于顶点个数很少,而且每个点的度数最多是20,所以可以暴力优化,建图,对于每个s点完全子图,如果i点在子图中,那么就枚举与i有边的其他点,(意思就是枚举完全图里面有i点的那些完全图,既然i点在完全图中,那么完全图中的别的点只能是i点集合里面的点,所以搜索所有i点集合里面的点),每加入一个点,就判断一下是否和其他已加入的点有边,如果是就可以加入,否则不能加。

有一点需要注意的是,如果已经搜索完全部的与i点有关的完全图,那么接下来要搜索的完全图里面一定不会再包含i点,所以要把与i点有关的边都删去,不然就会重复搜索完全图了,这里就是一个优化点。

代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <set>#include <map>#include <stack>#include <vector>#include <queue>#define ri(n) scanf("%d",&n)#define oi(n) printf("%d\n",n)#define rl(n) scanf("%lld",&n)#define ol(n) printf("%lld\n",n)#define rep(i,l,r) for(i=l;i<=r;i++)#define rep1(i,l,r) for(i=l;i<r;i++)using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int epg=10-8;int check[1000+10];vector<int>G[100+10];int e[100+10][100+10];int ans,cnt;int n,m,s;int ok(int u){    for(int i=0; i<cnt; i++)    {        if(!e[u][check[i]])            return 0;    }    return 1;}void dfs(int u,int id){    if(cnt==s)    {        ans++;        return ;    }    if(G[u].size()-id<s-cnt||id>=G[u].size())        return ;    if(ok(G[u][id]))    {        check[cnt++]=G[u][id];        dfs(u,id+1);        cnt--;    }    dfs(u,id+1);}int main(){    int t;    scanf("%d",&t);    while(t--)    {        //int n,m,s;        scanf("%d%d%d",&n,&m,&s);        memset(e,0,sizeof(e));        for(int i=0; i<100+10; i++)            G[i].clear();        for(int i=1; i<=m; i++)        {            int u,v;            scanf("%d%d",&u,&v);            G[u].push_back(v);            G[v].push_back(u);            e[u][v]=e[v][u]=1;        }        ans=0;        for(int i=1; i<=n; i++)        {            cnt=0;            check[cnt++]=i;            dfs(i,0);            //cnt--;            for(int j=1; j<=n; j++)            {                e[i][j]=e[j][i]=0;            }        }        printf("%d\n",ans);    }    return 0;}
原创粉丝点击