E - Counting Cliques

http://blog.csdn.net/eventqueue/article/details/52973747

http://blog.csdn.net/yuanjunlai141/article/details/52972715

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<queue>
  8.  
  9. using namespace std;
  10. const int maxn=;
  11. const int maxm=1e3+;
  12. int n,m,s;
  13. int deg[maxn];
  14. int mp[maxn][maxn];
  15. int Stack[maxn];
  16. int ans;
  17. struct Edge
  18. {
  19. int to;
  20. int next;
  21. }edge[maxm];
  22. int tot,head[maxn];
  23. void add(int u,int v)
  24. {
  25. edge[tot].to=v;
  26. edge[tot].next=head[u];
  27. head[u]=tot++;
  28. }
  29. void Init()
  30. {
  31. ans=;
  32. tot=;
  33. memset(head,-,sizeof(head));
  34. memset(deg,,sizeof(deg));
  35. memset(mp,,sizeof(mp));
  36. memset(Stack,,sizeof(Stack));
  37. }
  38. bool judge(int a[],int v)
  39. {
  40. for(int i=;i<=a[];i++)
  41. {
  42. if(!mp[v][a[i]])
  43. {
  44. return false;
  45. }
  46. }
  47. return true;
  48. }
  49. void DFS(int a[],int u)
  50. {
  51. if(a[]==s)
  52. {
  53. ans++;
  54. return;
  55. }
  56. for(int i=head[u];i!=-;i=edge[i].next)
  57. {
  58. int v=edge[i].to;
  59. //判断这个点是不是和每个已有团结点都有边
  60. if(judge(a,v))
  61. {
  62. //入栈
  63. a[++a[]]=v;
  64. DFS(a,v);
  65. a[]--;
  66. }
  67. }
  68. }
  69. int main()
  70. {
  71. int T;
  72. scanf("%d",&T);
  73. while(T--)
  74. {
  75. Init();
  76. scanf("%d%d%d",&n,&m,&s);
  77. int u,v;
  78. for(int i=;i<m;i++)
  79. {
  80. scanf("%d%d",&u,&v);
  81. //这是去重的关键
  82. /*用一个数组记录已经存在的团的大小,数组是一个由小到大
  83. 的数组,即前点要进入团时,判断该节点是否比团内所有点大,这样就避免了重复,判断大小时只需要判断进最后一个点是否比当前点小就行了
  84. 所以建图是可以按照 小的点指向大的点得方式建图,这样会少很多不必要的搜索操作 */
  85. /*之所以可以从小的节点指向大的节点是因为,最后要找的是一个无向完全图,在无向完全图中肯定可以找到一条从小节点依次走到到大节点的有向路:比如1->2->3这样的路,边的双向信息用另一个数组存一下就行了
  86.  
  87. 这样就减少了大量不必要的计算,而且不会重复,因为你在一个无向完全图里只可能找到一个,v1 < v2 < v3 ... < vx
  88. 这样的偏序关系的路,不可能再出现例如v2 < v1 < v3 < ... < vx这种路,因为这么多点大小的偏序关系是唯一的,确定了一次,以后都不会重复了,连标记去重都不用,真巧妙!*/
  89. if(u>v)
  90. {
  91. swap(u,v);
  92. }
  93. add(u,v);
  94. mp[u][v]=mp[v][u]=;
  95. //为了剪枝
  96. deg[u]++;
  97. deg[v]++;
  98. }
  99. for(int i=;i<=n;i++)
  100. {
  101. //剪枝,度小于s-1的一定不在团内
  102. if(deg[i]<s-)
  103. {
  104. continue;
  105. }
  106. //模拟栈,Stack[0]保存已经确定的团结点的大小
  107. Stack[]=;
  108. Stack[]=i;
  109. DFS(Stack,i);
  110. }
  111. printf("%d\n",ans);
  112. }
  113. return ;
  114. }

【算法系列学习】巧妙建图,暴搜去重 Counting Cliques的更多相关文章

  1. HDU5772 String problem 最大权闭合图+巧妙建图

    题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...

  2. 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)

    传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...

  3. UVA1327 && POJ1904 King's Quest(tarjan+巧妙建图+强连通分量+缩点)

    UVA1327 King's Quest POJ1904 King's Quest 题意: 有n个王子,每个王子都有k个喜欢的妹子,每个王子只能和喜欢的妹子结婚.现有一个匹配表,将每个王子都与一个自己 ...

  4. [ACM] POJ 3686 The Windy&#39;s (二分图最小权匹配,KM算法,特殊建图)

    The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4158   Accepted: 1777 Descr ...

  5. HDU5521 Meeting(dijkstra+巧妙建图)

    HDU5521 Meeting 题意: 给你n个点,它们组成了m个团,第i个团内有si个点,且每个团内的点互相之间距离为ti,问如果同时从点1和点n出发,最短耗时多少相遇 很明显题目给出的是个无负环的 ...

  6. BZOJ4152 The Captain(dijkstra+巧妙建图)

    BZOJ4152 The Captain 题面很简洁: 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 很明显 ...

  7. 【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

    3033: 太鼓达人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 154[Submit][Status][Discuss] ...

  8. poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙

    /** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...

  9. hdu 5952 Counting Cliques 求图中指定大小的团的个数 暴搜

    题目链接 题意 给定一个\(n个点,m条边\)的无向图,找出其中大小为\(s\)的完全图个数\((n\leq 100,m\leq 1000,s\leq 10)\). 思路 暴搜. 搜索的时候判断要加进 ...

随机推荐

  1. python 中如何导入一个自己创建的模块

    导入模块的语句的三种方法: 1.import module 2.from module import name1,[name2,name3....] 3.from module import * 先看 ...

  2. JavaWeb之Filter、Listener

    昨天和大家介绍了一下JSON的用法,其实JSON中主要是用来和数据库交互数据的.今天给大家讲解的是Filter和Listener的用法. 一.Listenner监听器 1.1.定义 Javaweb中的 ...

  3. React Native 之 项目实战(一)

    前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...

  4. Octave Tutorial(《Machine Learning》)之第五课《控制语句和方程及向量化》

    第五课 控制语句和方程 For,while,if statements and functions (1)For loop v=zeros(10,1) %initial vectors for i=1 ...

  5. 两个 Long 类型为什么不能直接用==比较

    这要说到==和 equals 的区别了. 1. ==比较的是两个对象在内存中的地址值(栈中的内容). 2.equals 是 java.lang.Object 类的一个方法.equals 比较的是两个对 ...

  6. idea调试SpringMvc, 出现:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener错误的解决办法

    有时,使用idea开发SpringMvc发现调试时出现以下错误: 12-Mar-2017 12:08:02.345 严重 [RMI TCP Connection(2)-127.0.0.1] org.a ...

  7. JavaScript当页面关闭时向后台发送请求

    今天做项目时遇上一个需求,当浏览器或页面关闭时将数据存储到数据库内.实现思想是采用js监测onunload然后发送请求.结果失败,刷新可以发送但是关闭并不能,整了一整天并没有解决,最后找到了解决办法. ...

  8. HTML——超文本标记语言

    HTML: 网站(站点) - 网页 1.HTML作为文件后缀名,可以把文件变为网页 2.HTML是一门编程语言的名字:超文本标记语言 3.超越了文字的范畴,除了文字还可以有图片.视频.音频.动画特效等 ...

  9. JavaScript入门必备

    1.JavaScript和Java没有关系,JavaScript是一门(客服端)脚本语言,并且是一个解释性语言. 2.添加JavaScript的方法 (1)内联:通过<script>js代 ...

  10. SqlCommandBuilder类是如何构建T-Sql语句

    本篇博客默认你看了[DataTable中AcceptChanges()方法的DataRowRowState属性]这篇博客. 在使用SqlCommandBuilder很简单,就是创建一个SqlComma ...