HDOJ 5952 Counting Cliques【2016沈阳现场赛】【暴力】

news/2024/11/29 5:33:54/

暴力姿势永远学不会的姿势



先说题意:n点m条边,问图中有多少种情况是:有s个点两两相连(问子图的独立团,其中点数为s)


看到数据量其实并不大,n是100,m是1000,s最大为10

还有一句话:It is guaranteed that the maximum degree of the vertices is no larger than 20.


这句话其实是提示了最好的枚举方向的:从小到大来枚举,当前团中的最小编号

用mp【u】【v】来存储边,用O(1)的时间来确定u和v是否相连

用vec【i】来存储边,可以直接枚举与点i相邻的所有边


当然,这样交上去是TLE的

剪枝条件1:记录每个点的度数。如果点i的度数+当前选中的所有点数+1仍然小于s,那么不需要搜索了

然后,还是TLE

学到的剪枝方法:对vec【i】中的点进行排序:为什么?因为这样,在dfs中就可以按照顺序从小到大进行搜索

如果不排序,那么每次都要从0枚举到vec【i】-1,是很浪费时间的


剪枝条件2:如果当前size中的值全部选出来都不够,那么及时return

剪枝条件3:起点的最大值为:n-s+1(意味着最大的s个编号的值全部相连,是1种情况,n-s+2这个点是不可能作为起点的,因为之后点数不够)

按照这个思路写出来的代码在时限上就足够了


</pre><pre name="code" class="cpp">#include<bits/stdc++.h>
using namespace std;const int maxn=110;
int T,n,m,s;
int cnt[maxn];
int mp[maxn][maxn];
vector<int> vec[maxn];
int ans,sz,st;
int num[maxn];void dfs(int pos,int step){if (step>s){ans++;//for(int i=1;i<=s;i++)//    printf("%d%c",num[i],i==s?'\n':' ');return;}for(int x=pos;x<sz-(s-step);x++){int v=vec[st][x];if (cnt[v]+step<s) continue;if (v<st) continue;int i;for(i=1;i<step;i++)if (!mp[num[i]][v]) break;if (i==step){num[step]=v;dfs(x+1,step+1);}}
}int main(){//freopen("input.txt","r",stdin);int u,v;scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&m,&s);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) mp[i][j]=0;cnt[i]=0;vec[i].clear();}while(m--){scanf("%d%d",&u,&v);cnt[u]++;cnt[v]++;vec[u].push_back(v);vec[v].push_back(u);mp[u][v]=mp[v][u]=1;}ans=0;int End=n-s+1;for(int i=1;i<=End;i++)if (cnt[i]+1>=s){num[1]=st=i;sort(vec[i].begin(),vec[i].end());sz=vec[i].size();dfs(0,2);}printf("%d\n",ans);}return 0;
}



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

相关文章

HDU 5952 Counting Cliques 爆搜

题目 HDU 5952 分析 题目数据很小&#xff0c;可以考虑暴力搜索。为了防止重复&#xff0c;建立一个小编号点指向大编号点的图&#xff0c;这样就不会重复了&#xff0c;因为搜索出来的序列一定是递增的。 这道题目让我懂得了&#xff0c;有时候TLE&#xff0c;不要总…

hdu 5952 - dfs+优化

题目链接:点击打开链接 题解思路:一开始直接每个枚举T了,后来直接找有连接的居然过了 。每次看这个点是否能加入这个团&#xff0c;然后分加入和不加入两种情况dfs就可以了。 代码: #include<bits/stdc.h> using namespace std; typedef long long ll; const int mx 1e…

HDU - 5952 Counting Cliques (dfs)

题目链接&#xff1a; Counting Cliques 题意&#xff1a;一个有N个点M条边的图&#xff0c;球其中由S个点构成的团的个数。一个团是一个完全子图。 题解&#xff1a;拿到这题想了好久。。没想到dfs就完事了。就dfs一下&#xff0c;回溯一下就ok了&#xff0c;铜牌题。 #includ…

Counting Cliques HDU - 5952

题目&#xff1a;https://vjudge.net/contest/194395#problem/E 题目大意 给你一个无向图&#xff0c;让你求其中大小为s的完全图分量。 分析 暴力来做&#xff0c;设置一个集合&#xff0c;dfs当前点是否与集合中的点都有边&#xff0c;边界为集合大小&#xff0c;会超时&…

HDU 5952 Counting Cliques(dfs)

http://acm.split.hdu.edu.cn/showproblem.php?pid5952 题目大意&#xff1a; n个点 m条边的无向图 问节点个数为s的完全子图个数 分析&#xff1a; 一开始以为是规律题找了半天规律 发现重复的情况没法处理 自己太菜了处理不了 后来就想暴力 直接暴…

Counting Cliques HDU - 5952 (暴力搜索)

Counting Cliques HDU - 5952 &#xff08;暴力搜索&#xff09; A clique is a complete graph, in which there is an edge between every pair of the vertices. Given a graph with N vertices and M edges, your task is to count the number of cliques with a specific…

hdu5952 Counting Cliques

一个关于图的需要dfs剪枝的暴力题&#xff0c;想了半天没什么思路&#xff0c;后来室友和我说的想法。 因为给你一个图&#xff0c;数大小为s的联通图的个数&#xff0c;连通图就是所有的点两两相连通&#xff0c;首先遍历i从1~n&#xff0c;找到和i相邻的点&#xff0c;如果 …

HDU-5952 Counting Cliques ,爆搜!

Counting Cliques 题意&#xff1a;给你n个点&#xff0c;m条边&#xff0c;求大小为s(s<10)的团有多少个&#xff0c;每个点的度最多20。 看到数据这么小&#xff0c;想着各种bitset暴力&#xff0c;想着把3元团预处理&#xff0c;再预处理4元团等等。写了两个多小时发现复…