HDU-5952 Counting Cliques ,爆搜!

news/2024/11/29 7:56:32/

Counting Cliques

题意:给你n个点,m条边,求大小为s(s<=10)的团有多少个,每个点的度最多20。

看到数据这么小,想着各种bitset暴力,想着把3元团预处理,再预处理4元团等等。写了两个多小时发现复杂度算错了,9元团的个数能达到1e6,这样我们两层循环预处理就不行了。

看题解原来是ssssb的爆搜,题目给你degree<=20就是在暗示你可以爆搜,于是爆搜写了一发结果TLE,What f*ck。再加了个小小的优化然后AC。。

TLE代码:

int n,m,s,sum;
int vis[101],g[101][101];
int tot,head[101];
struct egde
{int to,next;
} e[N];
void add(int u,int v)
{e[tot].to=v,e[tot].next=head[u];head[u]=tot++;
}
void solve(int u,int num)
{if(num==s){sum++;return ;}for(int i=head[u];i+1;i=e[i].next){int v=e[i].to,flag=1;if(vis[v]) continue;for(int i=1;i<=n;i++) if(vis[i]&&!g[v][i]) flag=0;if(flag){vis[v]=1;solve(v,num+1);vis[v]=0;}}
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&s);memset(vis,0,sizeof(vis));memset(g,0,sizeof(g));int u,v;tot=sum=0;memset(head,-1,sizeof(head));for(int i=1; i<=m; i++)//建单向边减少搜索次数{scanf("%d%d",&u,&v);if(u>v) swap(u,v);add(u,v);g[v][u]=g[u][v]=1;}for(int i=1; i<=n; i++)if(!vis[i]){vis[i]=1;solve(i,1);
//            vis[i]=0;}printf("%d\n",sum);}return 0;
}
上面的solve里面每次都要验证100个点,这样复杂度是100*10*100*100*T。

把这个地方优化一下, 把已标记过的放入栈里,每次判10个就可以了。

int n,m,s,sum;
int vis[101],g[101][101],Stack[101];
int tot,head[101];
struct egde
{int to,next;
} e[N];
void add(int u,int v)
{e[tot].to=v,e[tot].next=head[u];head[u]=tot++;
}
void solve(int u,int num)
{if(num==s){sum++;return ;}for(int i=head[u];i+1;i=e[i].next){int v=e[i].to,flag=1;for(int j=1;j<=num&&flag;j++) if(!g[v][Stack[j]]) flag=0;if(flag){Stack[num+1]=v;solve(v,num+1);}}
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&s);memset(g,0,sizeof(g));int u,v;tot=sum=0;memset(head,-1,sizeof(head));for(int i=1; i<=m; i++)//建单向边减少搜索次数{scanf("%d%d",&u,&v);add(u,v);g[v][u]=g[u][v]=1;}for(int i=1; i<=n; i++){Stack[1]=i;solve(i,1);}printf("%d\n",sum);}return 0;
}




http://www.ppmy.cn/news/363393.html

相关文章

hdu 5952 Counting Cliques(dfs优化)

题目&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5952 题意&#xff1a; 给一n个点m条边的图&#xff0c;找一个有s个顶点的完全子图。 分析&#xff1a; 对于每个s点完全子图&#xff0c;如果i点在子图中&#xff0c;那么就枚举与i有边的其他点&#xff0c;每加入…

利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能

一、FFmpeg简介。 二、FFmpeg常用参数及命令。 三、FFmpeg在Unity 3D中的使用。   1、FFmpeg 录屏。   2、FFmpeg 推流。   3、FFmpeg 其他功能简述。 一、FFmpeg简介 对于FFmpeg&#xff0c;其官网上是这样介绍的&#xff1a; FFmpeg is the leading multimedia fram…

hdoj 5952 Counting Cliques

题目链接&#xff1a;Counting Cliques 题目大意&#xff1a;给你一张n个点,m条边的无向图&#xff0c;问尺寸为s的完全图有多少个&#xff0c;尺寸即为这张完全图有多少个点&#xff0c;完全图是值每两点之间都有边 题目思路&#xff1a;这题吃时间吃的比较紧&#xff0c;想…

HDU 5952 搜索

题意 给一个无向图&#xff0c;所有点的度小于等于20。问这个图中有多少个完全子图。 题解 完全图就是一个图任意两点之间都有边相连。由于所有点的度都很小&#xff0c;我们可以暴力枚举完全图。 枚举过程首先从1号点开始&#xff0c;然后枚举与1号点相邻的点&#xff0c;…

HDU 5952

题意:给出一个无向图, 问其中的结点数为s的完全图有多少个 思路:我最初的思路是不管重复直接搜,然后最后答案除一个s的阶乘, 但是超时, 后来发现其实可以不算重复的, 就是将搜索有序化, 举个例子: 你现在有4个数 4 2 3 1, 那么你要选出其中3个, 那么选择的顺序就是 4 2 3 ,…

HDU5952

题目链接&#xff1a; HDU 5952 题意&#xff1a;给一个N个点M条边的的图&#xff0c; 求有多少个大小为S 的完全子图&#xff0c; &#xff08;题目trick&#xff1a;一个点度最多为20&#xff09;&#xff0c; 爆搜即可 &#xff08;需要单向建图&#xff08;U->V &…

HDU 5952 Counting Cliques dfs + 思维

传送门&#xff1a;HDU5952 题意&#xff1a;给出一个无向图&#xff0c;问其中点集大小为S的无向完全子图的个数。 思路&#xff1a;就是暴搜&#xff0c;但是建图有技巧&#xff0c;因为搜索过程中很容易出现重复序列&#xff0c;比如我们第一次搜到的答案是1 2 3&#xff…

基于Python的AutoSAR代码生成器---COM

基于Python的AutoSAR代码生成器---COM 1. 模板引擎-Jinja22. 开发环境准备3. JinJa2 模板&#xff08;Com_PbCfg.c&#xff09;3. 代码生成器4. 测试使用 1. 模板引擎-Jinja2 Jinja2是基于python的模板引擎&#xff0c;功能比较类似于于PHP的smarty&#xff0c;J2ee的Freemark…