Description

给出一个nnn个点m" role="presentation" style="position: relative;">mmm条边的无向图G=(V,E)G=(V,E)G=(V,E),对于VVV的一个四元子集V1={A,B,C,D}" role="presentation" style="position: relative;">V1={A,B,C,D}V1={A,B,C,D}V_1=\{A,B,C,D\},和EEE的一个五元子集E1={AB,BC,CD,DA,AC}" role="presentation" style="position: relative;">E1={AB,BC,CD,DA,AC}E1={AB,BC,CD,DA,AC}E_1=\{AB,BC,CD,DA,AC\},两者组成GGG的一个子图,问该种子图的个数,两个子图G1=(V1,E1),G2=(V2,E2)" role="presentation" style="position: relative;">G1=(V1,E1),G2=(V2,E2)G1=(V1,E1),G2=(V2,E2)G_1=(V_1,E_1),G_2=(V_2,E_2)相同当且仅当V1=V2,E1=E2V1=V2,E1=E2V_1=V_2,E_1=E_2

Input

多组用例,每组用例首先输入两个整数n,mn,mn,m表示点数和边数,之后mmm行每行输入两个整数u,v" role="presentation" style="position: relative;">u,vu,vu,v表示一条无向边

(2≤n≤105,1≤m≤min(2⋅105,n(n−1)2))(2≤n≤105,1≤m≤min(2⋅105,n(n−1)2))(2\le n\le 10^5,1\le m\le min(2\cdot 10^5,\frac{n(n-1)}{2}))

Output

输出GGG的这种特殊子图个数

Sample Input

4 5
1 2
2 3
3 4
4 1
1 3
4 6
1 2
2 3
3 4
4 1
1 3
2 4

Sample Output

1
6

Solution

只要求出含边x→y" role="presentation" style="position: relative;">x→yx→yx\rightarrow y的三元环个数cntx,ycntx,ycnt_{x,y},答案即为∑x<ycntx,y(cntx,y−1)2∑x<ycntx,y(cntx,y−1)2\sum\limits_{x

用setsetset存下所有的边,枚举xxx,把所有x" role="presentation" style="position: relative;">xxx的邻接点zzz打上x" role="presentation" style="position: relative;">xxx的标记,之后枚举xxx的邻接点y" role="presentation" style="position: relative;">yyy,如果yyy的度数不超过m" role="presentation" style="position: relative;">m−−√m\sqrt{m},则直接暴力枚举xxx的邻接点z" role="presentation" style="position: relative;">zzz,如果zzz带上了x" role="presentation" style="position: relative;">xxx的标记则x,y,zx,y,zx,y,z构成一个三元环,如果yyy的度数超过m" role="presentation" style="position: relative;">m−−√m\sqrt{m},枚举xxx的邻接点z" role="presentation" style="position: relative;">zzz,如果y,zy,zy,z这条边在setsetset里则x,y,zx,y,zx,y,z构成三元环,时间复杂度O(mlog2m)O(mlog2m)O(mlog_2m)

Code

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
#define maxn 100005
set<ll>s;
int n,m,vis[maxn],link[maxn];
vector<int>g[maxn];
int main()
{while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++)g[i].clear(),vis[i]=0,link[i]=0;s.clear();int N=(int)sqrt(m+0.5);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);s.insert((ll)n*u+v),s.insert((ll)n*v+u);}ll ans=0;for(int x=1;x<=n;x++){vis[x]=1;for(int i=0;i<g[x].size();i++)link[g[x][i]]=x;for(int i=0;i<g[x].size();i++){int cnt=0;int y=g[x][i];if(vis[y])continue;if(g[y].size()<=N){for(int j=0;j<g[y].size();j++){int z=g[y][j];if(link[z]==x)cnt++;}}else{for(int j=0;j<g[x].size();j++){int z=g[x][j];if(s.find((ll)n*y+z)!=s.end())cnt++;}}ans+=(ll)cnt*(cnt-1)/2;}} printf("%I64d\n",ans);}return 0;
}

HDU 6184 Counting Stars(分块)相关推荐

  1. HDU - 6184 Counting Stars(思维+三元环)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,问图中有多少个"三元环对","三元环对"指的是两个三元环共用了一条边 题目分析: ...

  2. 【HDU - 6184】Counting Stars(三元环计数,二分,优化暴力,O(m*sqrt(m)),图论)

    题干: Little A is an astronomy lover, and he has found that the sky was so beautiful! So he is countin ...

  3. D - Counting Stars HDU - 7059

    D - Counting Stars HDU - 7059 题解: 长度为n的序列a,有三个操作: 对某个区间进行询问 对于某个区间内的每个数ai,减去ai&(-ai) 对于某个区间内的每个数 ...

  4. 2021HDU多校8 - 7059 Counting Stars(线段树)

    题目链接:点击查看 题目大意:给出 nnn 个数字,需要执行 mmm 次操作,每次操作分为下列三种类型: 1 l r :输出区间 [l,r][l,r][l,r] 的 sumsumsum 和 2 l r ...

  5. 【HDOJ7059】Counting Stars(线段树,区间加,乘,标记)

    1004 Counting Stars 题意: 给出一个长为n的序列(1e5),支持3种操作: 1:查询[l,r]的区间和 2:修改[l,r]中每个数,都减去lowbit(x) 3:修改[l,r]中每 ...

  6. HDU 6184 2017广西邀请赛:Counting Stars(三元环)

    题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V=(A,B,C,D) && E=(AB,BC,CD,DA,AC) 可以看出A-struc ...

  7. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  8. hdu 3887 Counting Offspring

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一棵树,对于每一个节点,问他的子孙节点中有多少个节点小于该节点. 思路:首先找出这棵树 ...

  9. HDU 3240 Counting Binary Trees 数论-卡特兰数

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3240 卡特兰数递推公式h(i)=h(i-1)*(4*i-2)/(i+1) 如果直接算每一步,然后mo ...

  10. HDU 2431 Counting Problem

    题意: 问 n * n 的格子里面放 2*n个皇后的放法数,满足每行每列的皇后数都是2. 分析: 解法可以由前面的递推到后面,知道 2 * 2 的图有一种情况后,可知大于 2 * 2 的图都可以预留 ...

最新文章

  1. php利用上传文件,如何利用PHP上传文件
  2. ubuntu etc目录下配置文件profile和profile.d的区别?(文件解析)
  3. js数组常用方法总结(包括ES6)
  4. java http 工具类_Java发送Http请求工具类
  5. python入门教程
  6. “超详细” 山特UPS C3KR 的驱动安装教程
  7. php redis菜鸟教程,PHP 使用 Redis
  8. 大数据结合人工智能,助力智慧城市建设
  9. ACM计算几何模板(模板)
  10. Ubuntu16.04拨号上网
  11. PS 打好的字体 怎么修改 字体间距
  12. 带有风的诗词_2017含有风的诗句大全
  13. 电瓶车充电桩收费平台在福建学校的应用
  14. golang rabbitMQ 生产者复用channel以及生产者组分发策略
  15. js 中 中文、空格、数字、字符串混合排序
  16. java: -source 1.6 中不支持 diamond 运算符, (请使用 -source 7 或更高版本以启用 diamond 运算符)
  17. 传奇如何一台服务器配置多个版本微端更新
  18. 使用Maya的XGen快速头发建模
  19. Android入门教程 Android开发环境搭建【详细教程】
  20. python投掷骰子实验实验结论_Python 投掷骰子,并用pygal制图画出统计结果

热门文章

  1. @Transactional注解解析
  2. MATLAB中dsolve与syms
  3. springboot+vue解决跨域问题
  4. [计算机网络】【网络设备】VTP
  5. c语言程序函数由什么两部分组成,C语言中一个函数由函数首部和_____两部分组成. 答案:函数体...
  6. pentaho mysql_pentaho bi server 配置MySQL数据库
  7. 黑帽SEO-网页劫持
  8. java 快速判断对象是否为null的快捷方法
  9. 15篇文章贯通4级词汇
  10. 基于python、百度ocr、multiprocessing多进程、selenium网页自动化 、pyqt5界面弹出,实现发票的识别与对学校财务网站的脚本自动化上传操作的项目总结