题面

传送门

给出一张无向图,求 \(4\) 个点构成两个有公共边的三元环的方案数。

题解

orz余奶奶,orz zzk

首先,如果我们知道经过每条边的三元环个数\(cnt_i\),那么答案就是\(\sum_{i=1}^m{cnt_i\choose 2}\)

所以现在问题就是该怎么数三元环

据说有一个设阈值的\(O(m\sqrt{m})\)的做法,不过常数太大了,这里不讲

我们把每一条边重定向,设它连接的两个点的度数分别为\(deg_u\)和\(deg_v\),那么把这条边定为从度数大的连向度数小的,如果度数相同按标号大小。这样显然可以建出一个有向无环图

所以怎么找环呢

我们枚举点\(u\),并枚举它的所有出边,把出边指向的点\(v\)标记上\(u\)。然后再枚举一边出边,并对每个\(v\)也枚举出边,如果\(v\)的出边指向的点\(w\)上的标记是\(u\)那么说明找到了一个三元环

显然,每个三元环都会被统计恰好一次

接下来的问题是复杂度,我们要证明它的上界是\(O(m\sqrt{m})\)

1.\(\forall v,out_v\leq \sqrt{m}\),每一次枚举\(v\)的出边的复杂度不会超过\(O(\sqrt{m})\),所以这一部分复杂度不会超过\(O(m\sqrt{m})\)

2.\(\forall v,out_v\geq \sqrt{m}\),因为在这种情况下必有\(deg_u\geq deg_v\),所以所有这样的\(u\)不会超过\(O(\sqrt{m})\)个,每一个\(out_v\)的贡献最多是\(\sqrt{m}out_v\),由于\(\sum out_v=O(m)\),所以这一部分的复杂度也不会超过\(O(m\sqrt{m})\)

不过这个做法常数不知道比设阈值小到哪里去了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')if(ch==EOF)return -1;
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=2e5+5;
struct eg{int v,nx;}e[N<<1];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
struct EG{int u,v;}E[N];
int n,m,tim,deg[N],pt[N],vis[N],cnt[N];ll res;
int main(){
// freopen("testdata.in","r",stdin);
while(~(n=read(),m=read())){
tot=tim=0;fp(i,1,n)head[i]=deg[i]=vis[i]=0;
fp(i,1,m)E[i].u=read(),E[i].v=read(),++deg[E[i].u],++deg[E[i].v],cnt[i]=0;
fp(i,1,m)deg[E[i].u]>deg[E[i].v]||(deg[E[i].u]==deg[E[i].v]&&E[i].u>E[i].v)?add(E[i].u,E[i].v):add(E[i].v,E[i].u);
fp(u,1,n){
++tim;go(u)pt[v]=i,vis[v]=tim;
for(R int k=head[u];k;k=e[k].nx)go(e[k].v)
if(vis[v]==tim)++cnt[i],++cnt[k],++cnt[pt[v]];
}
res=0;
fp(i,1,m)res+=1ll*cnt[i]*(cnt[i]-1)>>1;
printf("%lld\n",res);
}
return 0;
}

HDU6184【Counting Stars】(三元环计数)的更多相关文章

  1. [hdu 6184 Counting Stars(三元环计数)

    hdu 6184 Counting Stars(三元环计数) 题意: 给一张n个点m条边的无向图,问有多少个\(A-structure\) 其中\(A-structure\)满足\(V=(A,B,C, ...

  2. Codechef SUMCUBE Sum of Cubes 组合、三元环计数

    传送门 好久没有做过图论题了-- 考虑\(k\)次方的组合意义,实际上,要求的所有方案中导出子图边数的\(k\)次方,等价于有顺序地选出其中\(k\)条边,计算它们在哪一些图中出现过,将所有方案计算出 ...

  3. 【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)

    [BZOJ5332][SDOI2018]旧试题(数论,三元环计数) 题面 BZOJ 洛谷 题解 如果只有一个\(\sum\),那么我们可以枚举每个答案的出现次数. 首先约数个数这个东西很不爽,就搞一搞 ...

  4. loj#6076「2017 山东一轮集训 Day6」三元组 莫比乌斯反演 + 三元环计数

    题目大意: 给定\(a, b, c\),求\(\sum \limits_{i = 1}^a \sum \limits_{j = 1}^b \sum \limits_{k = 1}^c [(i, j) ...

  5. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

  6. LOJ2565 SDOI2018 旧试题 莫比乌斯反演、三元环计数

    传送门 这道题的思路似乎可以给很多同时枚举三个量的反演题目提供一个很好的启发-- 首先有结论:\(d(ijk) = \sum\limits_{x|i}\sum\limits_{y|j}\sum\lim ...

  7. hdu6184 Counting Stars 【三元环计数】

    题目链接 hdu6184 题解 题意是让我们找出所有的这样的图形: 我们只需要求出每条边分别在多少个三元环中,记为\(x\),再然后以该点为中心的图形数就是\({x \choose 2}\) 所以我们 ...

  8. HDU 6184 Counting Stars 经典三元环计数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6184 题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V ...

  9. FJWC2019 子图 (三元环计数、四元环计数)

    给定 n 个点和 m 条边的一张图和一个值 k ,求图中边数为 k 的联通子图个数 mod 1e9+7. \(n \le 10^5, m \le 2 \times 10^5, 1 \le k \le ...

随机推荐

  1. 基于NodeJS的14款Web框架

    摘要: 在几年的时间里,Node.js逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量网站都采用Node.js进行开发,像PayPal, 此外,开发人员还可以使用它来开发一些快速移动W ...

  2. 快速上手Runtime(二)之给分类添加属性

    我们都知道,分类是不能直接添加属性的,那么我们有时候又需要实现这个功能,那么我们应该怎么办才能为分类添加上属性呢. Runtime给分类添加属性原理 给一个类声明属性,其实本质就是给这个类添加关联,并 ...

  3. 快速上手Runtime(一)之消息机制

    Runtime简介 Runtime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于动态 ...

  4. Java核心技术-异常、断言和日志

    程序发生错误时至少做到以下几点: *向用户通告错误 *保存所有的工作结果 *允许用户以妥善的形式退出程序 Java使用一种称为异常处理的错误捕获机制处理异常. 本章第一部分介绍Java的异常,第二部分 ...

  5. -other linker flags - 详解

    • 值:-objC,-all_load,-force_load

 • -objC: 在iOS 中,使用-all_load时,如果静态库中有类别时会出问题,使用其他两个值则不会有问题.

 • -al ...

  6. 无网络安装mysql步骤

    1. 先安装Microsoft Visual C++ 2010 运行环境,运行vcredist_x86.exe文件: 2. 安装MySql数据库,运行mysql-installer-community ...

  7. [C++] right value reference

    the advantage of  right value reference: Memory Optimization save memory copy

  8. list 返回列表null替换

    function formatt(rec, val, index) { if (rec === null || rec == "null") { return "0&qu ...

  9. 将std::string当字节流使

    string是C++标准定义的字符串类,它不但支持文本,而且支持二进制字节流.给一个string变量赋值有多种方法: 1) 拷贝构造函数 2) 等号赋值函数 3) append成员函数 4) push ...

  10. 编写高质量代码改善C#程序的157个建议——建议65:总是处理未捕获的异常

    建议65:总是处理未捕获的异常 处理为捕获的异常是每个应用程序具备的基本功能,C#在APPDomain提供了UnhandledException事件来接收未捕获到的异常的通知.常见的应用如下: sta ...